下午看了一些关于extern "C"的博客,都写得很啰嗦,看来看去还是有一些细节不怎么了解,自己开了个程序测试了一下,总结了什么情况下需要加入extern “C”
首先c++和c语言编译器在将cpp编译成.o文件的时候对函数的编译方式是不一样的
例如函数void foo(int)
c++编译器会编译成_int_foo
c语言编译器会编译成_foo()
同样c++和c语言在链接的时候查找规则也是不一样的
还是以void foo(int)为例
c++会使用_int_foo去.o文件中查找
c会使用_foo()去查找
这样问题就来了。如果你在c++链接器下调用使用c编译器的文件(比如dll)那系统会提示找不到函数,反过来也找不到函数。为了解决这个问题就引入了extern "C",
extern "C" 就是提示编译器(确切的说是提示C++的编译器)使用C语言的方式进行编译或者链接
所以为了确保使用不同编译器编译出来的代码出现找不到函数的情况,在c++编译器下需要在c代码的声明和定义中都加入extern "C"
同时C++在调用这些C函数的时候也应该加入extern "C"(或者引入带extern "C"的头)
代码如下:
//foo.h
#ifndef FOO_H
#define FOO_H
#ifdef __cplusplus
extern "C"{ //所有在大括号中的函数都会自动加上extern "C"
#endif
void foo(int);
void foo1(char);
//...other function
#ifdef __cplusplus
}
#endif
#endif//FOO_H
//foo.cc
/*包含了foo.h编译的时候就会自动使用c风格了,如果你不想包含foo.h的话,那还有另外两种办法
*1.像头文件一样把所有函数定义包含在extern "C"{....}中
*2.在每个函数定义前加上 extern "C" 如:extern "C" void foo(int){....}
*上面两种方法都需要判断是否c++编译器,因为在c编译器中使用extern "C"会报错,这里只是帮助理解而已,还是包含头文件吧。
*/
#include "foo.h"
void foo(int){
//...do something
}
void foo1(char){
//...do something
}
//main.cc
#include "foo.h"
int main(int argc, char* argv[]){
foo(1); //根据foo.h的声明采用c风格方式查找
return 0;
}
使用c++编译器(__cplusplus已定义)
g++ -o main main.cc foo.cc
使用c语言编译器
gcc -o main main.cc foo.cc
原文链接:https://blog.csdn.net/kluleia/article/details/45077875
更多文章推荐: