重新审视C++中包含 C 标头

Inclusion of C headers in C++ revisited

本文关键字:标头 包含 新审视 C++      更新时间:2023-10-16

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

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

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

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

但到目前为止,我发现的只是外部"C"只能保证名称修饰被关闭。

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

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

extern "C"是一个

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

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

extern "C"只更改链接,即重整和可能的调用约定。尝试使用 C 和 C++ 编译器编译和运行此程序:

#include <stdio.h>
#ifdef __cplusplus
extern "C" {
#endif
    inline void putsizeofchar()
    {
        printf("%zdn", sizeof(char));
    }
#ifdef __cplusplus
}
#endif
int main()
{
    putsizeofchar();
    return 0;
}

由于标头包含是两种语言的文本替换,因此缺少标头没有任何区别。