C++中extern "C"包裹头文件用法的技术咨询
关于C++中
extern "C"的详解 嘿,刚入门C++碰到这个太正常了!我当初第一次见extern "C"的时候也一脸问号,这就给你把它的来龙去脉讲明白:
核心原因:C与C++的「名字修饰」差异
C++支持函数重载,编译器为了区分不同参数的同名函数,会对函数名做名字修饰(Name Mangling)——简单说就是把函数的参数类型信息揉进最终的符号名里。比如:
// C++编译后,这个函数的符号名可能变成 _Z4funci void func(int); // 而另一个重载的func符号名可能是 _Z4funcd void func(double);
但C语言不支持重载,编译器只会用函数的原始名字作为符号名,比如上面的func(int)在C里编译后符号名就是func。
如果在C代码里直接调用C写的函数,不加extern "C"的话,C编译器会按自己的规则去寻找修饰后的符号,结果自然找不到C编译出来的原始func,直接就会报链接错误。
extern "C"的作用
extern "C"是C提供的链接指示符,它告诉编译器:「花括号里的内容是C语言风格的,别给我做C的名字修饰!」
你代码里的写法:
extern "C" { #include "file1.h" #include "file2.h" }
意思就是告诉C++编译器:file1.h和file2.h里的所有函数声明都是C语言的,编译时要按C的规则处理这些函数的符号名,这样链接的时候就能正确找到C实现的函数了。
几个需要注意的点
- 它只作用于函数声明(头文件里都是声明,所以这么用没问题),不要用它包裹函数的定义
- 很多C语言头文件本身已经做了兼容处理,比如:
这种情况下你即使不额外包裹也能正常用,但额外包一层也不会有问题#ifdef __cplusplus extern "C" { #endif // 头文件内容 #ifdef __cplusplus } #endif - 如果反过来要让C代码调用C函数,那C的函数声明必须加上
extern "C",这样C编译器才能识别正确的符号名
总之,extern "C"就是C和C++混编时的「翻译官」,解决两种语言编译器符号命名规则不同导致的链接问题~
内容的提问来源于stack exchange,提问作者swathi
相关产品推荐
相关产品推荐

