[原创] c++ 的 extern "C" 及 error C2732(Updated on April 10th, 2020)
编译器错误 C2732
链接规范与“function”的早期规范冲突
该函数已经使用其他链接说明符声明。
具有不同链接说明符的包含文件可能会导致此错误。
要修复此错误,请更改 extern
语句,以便这些链接一致。 特别是,不要对 extern "C"
块中的 #include
指令换行。
// C2732.cpp extern void func( void ); // implicit C++ linkage extern "C" void func( void ); // C2732
上述情况是由于在vs中, 头文件(.h) 的函数隐式的声明为C++链接符, 而我在对应源文件(.cpp)的函数实现添加了extern "C”{ ...}; 定义本质上是特殊的声明, 这样就相当于一个函数有两个链接说明符. 便产生Error C2732.
//hello, .c #include <iostream> using namespace std; int main() { #ifdef __cplusplus cout << "hello, cpp!" << endl; #else cout << "hi~, .c" << endl; #endif return 0; }
// externC.c, externC.cpp extern "C"{ #include<string.h> } int main(){ return 0; }
gcc -c externC.c g++ -c externC.c gcc -c externC.cpp
ps:
1. gcc 及 g++编译器都可编译.cpp文件, 但是gcc不能自动连接C++调用的库, 统一起见, 编译/链接都采用g++;
2. 对于.c文件, gcc当做c语言文件, 设置C形式链接, 而g++当做c++语言文件, 设定C++形式的链接.
3. __cplusplus 这个宏只是标识按照C还是C++的语法来解释. 当且仅当采用gcc编译.c文件时, 这个宏才是未定义的. gcc编译. cpp 或 g++ 编译 .c 都有定义. 与此相对应的是extern "C"(linkage Directives), 只有gcc编译.c文件时, 链接指示符无效, 其余情况均是按照c++语法解释链接指示符.
Summary:
其实总的说来, 无非是用什么编译器(gcc, g++, cl) 按照什么语法规则(c, c++) 来解释、链接源文件(.c, .cpp), extern "C" 本意是为了c++方便调用C的接口, 至于c调用c++, 现在有个新的理解, 即将c按照c++来编译即可.