5

我刚刚阅读了一个关于 SO 的问题,讨论了一段代码在 C 和 C++ 中都有效但会在每种语言中产生不同行为的场景。

这就引出了一个问题:在 C++ 代码中包含 C 头文件时,这是否会成为问题?

从这个问题中知道你应该包含这样的 C 头文件:

extern "C" {
#include <your_os_or_library_header_in_c.h>
}

但到目前为止我发现的只是 extern "C" 只保证名称修改被关闭。

我找不到任何关于它是否将所有语句评估为 C 的信息,因此例如sizeof('a')or 10 //* comment */ 2(您可以在内联函数中找到)被解析为 C 而不是 C++。(请注意,依赖编写 C 标头的人的这种行为显然是一个坏主意,但我是从纯粹的学术角度提出的“如果?”。)

C++ 标准是否说包含代码块extern "C"意味着其中的所有语句都必须解析为 C?

4

2 回答 2

7

extern "C"是一种 C++ 结构,它影响 C++ 程序中的语言链接。它不会以任何方式将语言切换为 C。声明中的所有源文本extern "C"仍被解析为 C++ 并且仅解析为 C++。

请注意,这extern "C"不仅仅影响名称修饰 - 例如,具有 C 和 C++ 语言链接的函数可能具有不同的调用约定(理论上)。

于 2013-11-12T12:55:01.377 回答
3

extern "C"仅更改链接,即修改和可能的调用约定。尝试使用 C 和 C++ 编译器编译和运行这个程序:

#include <stdio.h>

#ifdef __cplusplus
extern "C" {
#endif
    inline void putsizeofchar()
    {
        printf("%zd\n", sizeof(char));
    }
#ifdef __cplusplus
}
#endif

int main()
{
    putsizeofchar();
    return 0;
}

由于标题包含在两种语言中都是文本替换,因此缺少标题并没有任何区别。

于 2013-11-12T12:55:57.340 回答