编写兼容C++的C库时,extern "C"应放在头文件包含语句之前还是之后?
结论
你当前的头文件写法是正确的,不要将extern "C"块移动到头文件包含指令之前。
原因说明
- 首先要明确:
extern "C"的作用范围是C++编译器当前的作用域,而#include是预处理阶段的文本替换操作。如果你把所有#include指令都放在extern "C"块内,被引入的头文件的所有内容都会被强制套上extern "C"修饰,这会引发大量兼容性问题:- 如果你引入的是C头文件,头内的命名空间、函数重载、类定义等C特性被
extern "C"包裹后会直接编译失败 - 哪怕是C语言头文件,大部分正规的公共头(包括标准库头
stdarg.h、stddef.h等)本身已经内置了__cplusplus判断和extern "C"包裹逻辑,外层额外套一层完全多余,甚至可能因为头文件内extern "C"配对不当引发语法错误
- 如果你引入的是C头文件,头内的命名空间、函数重载、类定义等C特性被
- 对于本身就带
extern "C"声明的被引入头文件,放在extern "C"块外完全不会影响它自身的逻辑,它的C ABI适配会正常生效,不会和你自己头文件的extern "C"产生冲突 - 通用的C/C++兼容头文件编写规范就是你当前的结构:先写头文件守卫,再引入所有依赖头,再用
extern "C"包裹你自己库的对外接口声明,最后关闭extern "C"和头文件守卫,这种写法的兼容性是最好的。
你当前的正确写法示例
#ifndef FOO_H_ #define FOO_H_ // 所有依赖头放在 extern "C" 块外 #include <bar.h> #include <stdarg.h> #include <stddef.h> // 仅包裹当前库自己的对外接口 #ifdef __cplusplus extern "C" { #endif void foo_func(); #ifdef __cplusplus } #endif #endif
内容的提问来源于stack exchange,提问作者einpoklum
相关产品推荐
相关产品推荐

