extern "C" void func(int a, int b) {}
int main() {}
编译成可执行文件 test 后
nm -s test
可以看到
0000000000400850 T func
而不加 extern "C" 时可以看到
0000000000400850 T _Z4funcii
用
c++filt _Z4funcii
解释得到
func(int, int)
结论
可以推测,C 不支持重载,C 函数签名不会带上参数信息。
而 C++ 支持重载,所以 C++ 函数签名带上参数信息才能确保该签名唯一性。
所以 extern "C" 即让 C++ 函数签名像 C 一样不带参数信息。
extern "C" 主要用于跨语言的函数调用场景,特别是在需要混合使用 C 和 C++ 代码时非常有用。它能够确保函数的链接符号在 C 和 C++ 之间保持一致,从而避免因名字修饰而导致的链接问题。
用途
C++ 代码调用 C 代码时。
C++ 代码暴露给 C 使用。
混合 C、C++ 使用。
避免签名冲突。