看如下这段头文件代码:
#ifndef _INCvxWorksh //防止该头文件被重复引用
#define _INCvxWorksh //防止该头文件被重复引用
#ifdef _cplusplus //表示当前使用的是C++编译器
//#ifdef _STDC_ //表示当前使用的是C编译器
extern "C" {
#endif
/*...*/
#ifdef _cplusplus
}
#endif
#endif /* _INCvxWorksh*/ //防止该头文件被重复引用
上段代码中,"extern "C" "部分包含两种含义:
含义一:被它修饰的目标是"extern",即告诉编译器,其声明的函数和变量可以在本模块或其他模块中使用。通常在模块的头文件中对本模块提供给其他模块引用的函数和全局变量以关键字extern声明。
比如,当模块B想引用该模块A中定义的全局变量和函数时,只需要包含模块A的声明就可以了!这样就可以保证在B模块调用A模块的函数,在编译过程中模块B虽然找不到A所定义的函数,但并不会报错,编译器会在连接阶段中从模块A编译生成的目标代码中找到想调用的位于A中的函数。
含义二:被它修饰的目标是"C"的,即其修饰的变量和函数是按照C语言方式去编译和连接的。这种机制是C++编译器提供的与C连接交换指定的符号,用来解决名字匹配的问题。换句话说,这保证了C语言编写的程序可以在C++编译器中,稳定的被调用。