我刚刚阅读a question on SO讨论了一段代码在C和C ++中都有效但会在每种语言中产生不同行为的场景。
这引出了一个问题:在C ++代码中包含C标头时,这可能是一个问题吗?
我知道from this question你应该像这样包含C标题:
extern "C" {
#include <your_os_or_library_header_in_c.h>
}
但到目前为止我发现的只是extern“C”只保证 name mangling 被关闭。
我找不到任何关于它是否将所有语句评估为C的信息,以便例如sizeof('a')
或10 //* comment */ 2
(您可以在内联函数中找到)被解析为C而不是C ++。 (请注意,依赖于编写C头的人这样的行为显然是一个坏主意,但我从纯粹的学术角度问“如果会怎样?”。)
C ++标准是否说在extern "C"
中包含一段代码意味着其中的所有语句必须解析为C?
答案 0 :(得分:7)
extern "C"
是一个C ++结构,它影响C ++程序中的语言链接。它不会以任何方式将语言切换为C. extern "C"
声明中的所有源文本仍然被解析为C ++和C ++。
请注意,extern "C"
不仅仅影响名称修改 - 例如,(理论上)C和C ++语言链接的函数可能具有不同的调用约定。
答案 1 :(得分: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;
}
由于标题包含是两种语言的文本替换,缺少标题不会有任何区别。