重新审视C++中包含 C 标头
Inclusion of C headers in C++ revisited
我刚刚读到一个关于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;
}
由于标头包含是两种语言的文本替换,因此缺少标头没有任何区别。
相关文章:
- 标头包含不是 .c 程序所必需的,而是.cpp程序需要的
- Visual Studio 2013 标头包含失败
- clang-cl PCH 缺少标头包含错误
- 使用相对标头包含路径重新分析 ASTUnit 失败
- 如果标头包含在另一个标头中,但不包含 CPP,则静态断言
- C++ 相互标头包含和前向声明
- 将 Boost 标头包含在 .h 文件中但不包含在.cpp文件中时出错
- 将源和标头包含到顶级C包装器中
- 如何将Qt标头包含在内核中
- cuda标头包含失败
- 由于相互标头包含,无法成功地与模板化类中的模板化方法交朋友
- C++参数化标头包含
- C++:快速确定适当的标头包含列表
- main中的标头包含.cpp有效,但在类中抛出错误
- C++标头包含
- 如何解析此标头包含循环
- 防止标头包含在编译时的某些文件中
- C++中的递归标头包含错误
- 如何使用 make 来维护一个通用的C++标头包含目录
- 标头包含性能