一、extern "C"讲解
extern "C"是使C++能够调用C写作的库文件的一个手段,如果要对编译器提示使用C的方式来处理函数的话,那么就要使用extern "C"来说明。__cplusplus是cpp中的自定义宏,那么定义了这个宏的话表示这是一段cpp的代码。
main.cpp
extern void f1(); int main() { f1(); return 0; }
a.cpp
#include <stdio.h> void f1() { printf("test\n"); }
makefile
all: g++ -o base.o -c base.cpp g++ -o main.o -c main.cpp g++ -o test main.o base.o
用UE打开base.o,可以看到base.cpp _Z2f1v puts __gxx_personality_v0,此时编译器将函数定义为_Z2f1v。
我们再对代码进行修改,将f1()函数的定义用extern "C"定义成c函数,在main中要引用的话,我们就需要加入extern "C"来声明f1()函数。
main.cpp
#ifdef __cplusplus extern "C" { #endif extern void f1(); #ifdef __cplusplus } #endif int main() { f1(); return 0; }
a.cpp
#include <stdio.h> extern "C" { void f1() { printf("test\n"); } }
此时再次查看base.o,将看到base.cpp f1 puts __gxx_personality_v0,编译器将其编译为c函数f1。
如果我们将main.cpp中的extern "C"去掉呢?再次编译,将会报main.cpp:(.text+0x12): undefined reference to `f1()',找不到f1()的定义。因为这时候编译器会去寻找函数名为_Z2f1v的c++定义。
是不是对extern "C"有了一个新的认识呢。在编写c++代码的时候,我们经常要调用一些以前写过的c库,所以在调用的时候,一定要记住使用extern "C"来声明函数。否则会编译不过的哦。
二、extern用法
对于c
1、函数名之前加extern作用是声明该函数,可能在别的源文件中定义。其实不使用extern效果是一样的。
2、extern修饰变量时,表明该变量在别处定义过了,这里将使用那个变量。
对于c++
1、养成良好的编程习惯,变量的定义放在cpp中。这样只需要引用.h就完成了变量的声明啦。我在写c++代码的时候真的好少用extern。
2、对于c库一定要记得使用extern "C"