[原创] 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++来编译即可.

 

https://www.xuebuyuan.com/414233.html

posted @ 2020-04-13 08:58  GeneWong  阅读(801)  评论(0编辑  收藏  举报