extern “C”的含义
extern C 完整讲解C 专用解决 C/C 混编符号兼容1. 核心作用C 支持函数重载、命名空间、类成员函数编译时会对函数名做名字改编Name Mangling C 语言没有重载不会修改函数名。extern C的作用告诉 C 编译器这段代码按照 C 语言规则编译、生成 C 风格符号不做名字改编。2. 两种使用场景场景 1C 调用 C 写的库最常用C 库头文件比如 stdio.h、自定义 C 静态库直接在 C 里引入会链接报错因为符号名对不上。标准写法头文件兼容 C/C#ifdef __cplusplus extern C { #endif // C 风格函数声明 void func(int a); int add(int x, int y); #ifdef __cplusplus } #endif含义如果是 C 编译器编译包裹在extern C {}内函数按 C 规则导出符号如果是 C 编译器__cplusplus未定义直接忽略这段标记。场景 2C 调用 C 写的函数C 不能识别 C 改编后的函数名C 对外暴露接口必须加extern C// .cpp 文件 extern C void cpp_api() { // 内部可以正常写C代码类、string、重载等 }编译后cpp_api符号名不变C 代码可以直接void cpp_api();调用。3. 对比有无 extern C 的符号差异举个例子void test(int)不加 extern C纯 C GCC 改编后符号_Z4testi加 extern C 符号直接为test链接器去库中找符号时名字必须完全匹配名字不一致就报undefined reference。4. 关键限制extern C内部不能写 C 重载函数C 不支持重载多个同名 C 函数会符号冲突extern C { void f(int); void f(double); // 编译报错C不允许重载 }只能修饰全局普通函数 / 全局变量不能修饰类、成员函数、模板。extern C只影响编译阶段符号生成函数内部逻辑依然可以完整使用 C 特性类、STL、异常等。