【问题标题】:Why can't putc() be implemented as a macro in C++? (Or can it?)为什么 putc() 不能在 C++ 中实现为宏? (或者可以吗?)
【发布时间】:2021-01-31 19:46:36
【问题描述】:

在 fputc()/putc() 上阅读 en.cppreference.com,我偶然发现了以下语句:

在 C 中,putc() 可以实现为宏,这在 C++ 中是不允许的。

这是真的吗?如果是这样,那么(在 C++ 标准中)是在哪里声明的?

可能相关:https://stackoverflow.com/questions/10712423

【问题讨论】:

标签: c++ language-lawyer stdio


【解决方案1】:

putc 在 C 标准中被指定为函数:

7.19.7.8 putc 函数

C 标准允许将任何 C 标准库函数实现为宏(仍然需要提供真正的函数实现,但如果在标头中定义了宏,则将使用该宏):

7.1.4 库函数的使用

在头文件中声明的任何函数都可以另外实现为类似函数的宏

但 C++ 标准明确规定这些必须定义为函数:

17.4.1.2.6 标头

在 C 中定义为函数的名称应在 C++ 标准库中定义为函数。

脚注明确说明不允许额外的宏定义:

这不允许在 C 语言中允许在函数原型之外提供“掩码宏”的做法。在 C++ 中实现等效“内联”行为的唯一方法是提供一个定义为外部内联

【讨论】:

    猜你喜欢
    • 2012-01-10
    • 2019-09-16
    • 2017-12-24
    • 2011-01-15
    • 2010-09-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多