“C”

为什么要使用extern "C"

匆匆过客 提交于 2020-03-15 23:50:24
C/C++采用的是分别编译模型, 源代码只要声明函数, 就可调用。 编译时,在函数调用处生成一个符号引用。 链接时,将函数调用处的符号引用,替换成地址(甚至仍有可能继续保留符号, 载入时再计算地址)。 所以, 以下两者必须完全比配, 否则链接时会出错。 1. 函数调用处引用的符号名 2. 函数定义处公开的符号名 如何使得两者匹配? 无论是在调用处还是在定义处, 无论是C还是C++(注1), 编译器都会对函数名进行mangling, 产生一个符号名。 而 extern "C" 就是通知C++编译器(注2), 将某函数按照C的规则进行mangling, 产生符号名。 如果是在声明处使用 extern "C", 函数调用处引用的符号名将按C的mangling规则产生。 如果是在定义处使用 extern "C", 翻译单元里公开的符号名将按C的mangling规则产生。 同时, C编译器将 extern "C" 视为错误—— 所以需要类似 的代码 : #ifdef __cplusplus extern "C" { #endif /*...*/ #ifdef __cplusplus } #endif extern "C" 通常使用的地方。 1. 当一个函数已经由C编译器实现 在一个C++翻译单元中, 必须使用 extern "C" 声明改函数。 这样,