重新考虑在C ++中包含C头

时间:2013-11-12 12:52:54

标签: c++ c header-files extern

我刚刚阅读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?

2 个答案:

答案 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;
}

由于标题包含是两种语言的文本替换,缺少标题不会有任何区别。