extern "C"的概述
从字面上看:extern C,有两部分的内容:extern和“C”,以下分别说明:
(1)extern
学过C/C++(cplusplus/cpp)的人都知道,extern是编程语言中的一种属性,它表征了变量、函数等类型的作用域(可见性)属性,是编程语言中的关键字。当进行编译时,该关键字告诉编译器它所声明的函数和变量等可以在本模块或者文件以及其他模块或文件中使用。通常,程序员都只是在“*h”(头文件)使用该关键字以限定变量或函数等类型的属性,然后在其他模块或本模块中使用,如:
file1.h
extern int i;
///////////////////////////////////////////////////////
file2.c /*其他文件调用该变量*/
int welcom(void)
{
if (i>0)
{
printf(Hello World!\n)
}
}
///////////////////////////////////////////////////////
(2)“C”
编程语言种类繁多各有优劣,因此在做软件工程时,往往会出现不同语言嵌入或互相调用的情况;例如在C和C++之间就经常出现互相调用!虽然C++是C的超集,但是,它们之间的编译器是不同的,这就引发了各自的编译器在对C和C++进行编译时要依据哪一个作为大家都认可的规范或者约定的问题。很幸运的是,通过一些基础特征我们制定了这样的一个规约,这就是“C”的出处,这些基础特征就是:
1)这种调用编译是一种“超”链接;
2)这种调用编译不能影响现有的编译规范;
3)C++是C的拓展,是C的升华。
根据1),extern关键字可以表达这种“超”链接;根据2)、3)用“C”来规约在C++中对C的编译。
因此,extern C表明了一种编译规约,其中extern是关键字属性,“C”表征了编译器链接规范。对于extern C可以理解成在C++/C中的混合编程的编译指令。
明白了这层意思,下面的代码就不难解释了:
#ifdef __cplusplus /*如果采用了C++,如下代码使用C编译器;*/
extern C /*如果没有采用C++,顺序预编译
{
#endif
/*代码段*/ /*采用C编译器编译的C语言代码段*/
#ifdef __cplusplus /*结束使用C编译器*/
}
#endif