1.为什么标准头文件中都有如下结构(比如stdio.h文件):
#ifndef _INC_STDIO //这个宏防止头文件被重复包含
#define _INC_STDIO
#ifdef __cplusplus //保证能同时被C编译器和C++编译器调用。
extern "C" {
#endif
/*...
.....
*/
#ifdef __cplusplus
}
#endif
#endif /* _INC_STDIO*/
在C++中,extern "C"的作用是告诉C++编译器对它声明的函数编译时要按照C编译器的方式,这样才能保证在链接时找到对应的函数。
比如对于函数:
void foo( int x, int y );
C编译方式:函数名变为_foo
C++的编译方式:函数名变为_foo_int_int【这也说明了为什么C++支持函数重载。】
实际上,C++中的extern "C"是对关键字extern 的重载【extern关键字使得函数/变量可以被其它文件访问,与static正好相反。】,extern "C"的功能是改变C++的编译方式。
2.C/C++混合编程:
(1)如果C++调用一个C语言编写的.DLL时,在包含.DLL的头文件前,应加extern "C" ,如下所示:
extern "C" //由于标准头文件里面都已经加上了extern "C",如上述1所示,所以我们不用再加了。
{
#include "cExample.h"
}
(2)在C中引用C++编写的函数库时,C++的头文件中的函数前需添加extern "C",而且在C程序中不能直接包含该头文件,应该在C程序的函数前加上extern关键字。