在CPP的代码中经常看到这样的一段申明:
#ifdef __cplusplus
extern "C" {
#endif
// Your Code
#ifdef __cplusplus
}
#endif
第一行 __cplusplus 是CPP编译器内部定义的宏,所以若这段代码是CPP编译器处理的,那么代码将会被 extern "C" { CODE } 包含起来,编译器对这段代码进行特殊处理;
第二行 extern "C",顾名思义,就是说{CODE}中包含的是一段C语言代码,而非CPP的
“知其然,知其所以然”
为什么要这么区分?看看下面这段代码编译出来的OBJ文件就知道了:
#ifdef __cplusplus
extern "C" {
#endif
void fooA()
{}
#ifdef __cplusplus
}
#endif
void fooB()
{}
//注意,要用C++编译器编译此文件
g++ -c test.cpp
然后将生成的目标文件反编译看看C++编译器做了什么
// d: disassembler
objdump -d test.o > log.txt
打开log.txt,我们看到:
test.o: file format pe-i386
Disassembly of section .text:
00000000 <_fooA>:
0: 55 push %ebp
1: 89 e5 mov %esp,%ebp
3: 5d pop %ebp
4: c3 ret
00000005 <__Z4fooBv>:
5: 55 push %ebp
6: 89 e5 mov %esp,%ebp
8: 5d pop %ebp
9: c3 ret
a: 90 nop
b: 90 nop
可以发现,被 extern "C" { } 包含的fooA函数名称没有发生变化,但是未被包含的 fooB 名称被处理过了。这里可以解释,extern "C" 申明这是一块 C 语言代码,而 C 和 C++ 一个很重要的区别是后者函数可以重载,因为参数和返回值的不同,同一个函数名可以被使用很多次而不会出现命名冲突,就需要编译器处理一下。
了解更多的信息可以参考这篇博客:
http://blog.youkuaiyun.com/chary8088/article/details/7255010