1. extern "C"
为了在C++代码中调用用C写成的库文件,就需要用extern "C"来告诉编译器:这是一个用C写成的库文件。
因为不能使用cpp编译器去编译c文件,因而要加上extern "C"告诉编译器应当以C的方式来链接它们。
extern "C"链接指示的这种形式包含一个关键字extern,后面是一个字符串值常量,以及普通的函数声明。因为关联C语言,所以添加"C"。?为了支持原来的C代码和已经写好C库,需要在C++中尽可能的支持C。
为了链接多个声明,在链接指示后面跟上花括号若干声明从而一次性建立多个连接。
因此多重声明用于整个头文件可以在头文件夹中如是引用。
#ifdef __cplusplus
extern "C" {
#endif
//一段代码
#ifdef __cplusplus
}
#endif
C和C++对函数的处理方式是不同的。extern "C"是使C++能够调用C写作的库文件的一个手段,如果要对编译器提示使用C的方式来处理函数的话,那么就要使用extern "C"来说明。
2. 对接到C的预处理器的支持
在C和C++中编译同一个源文件,在编译cpp版本的程序时加入预处理器定义__cplusplus,利用这个变量,在编译cpp时可以有条件的包含一些代码。
#ifdef __cplusplus //判断以下是否编译的时cpp程序
3.??在C++中引用C函数
//test.c
#include <stdio.h>
void mytest()
{
printf("mytest in .c file ok\n");
}
//main.cpp
extern "C"
{
void mytest(); //声明函数就行了
}
int main()
{
mytest();
return 0;
}
4.?在C中引用C++函数
在C中引用C++语言中的函数和变量时,C++的函数或变量要声明在extern "C"{}里,但是在C语言中不能使用extern "C",否则编译出错。
//test.cpp
#include <stdio.h>
extern "C"
{
void mytest()
{
printf("mytest in .cpp file ok\n");
}
}
//main.c
void mytest(); //声明函数就行了
int main()
{
mytest();
return 0;
}
5. 综合使用
一般我们都将函数声明放在头文件,当我们的函数有可能被C或C++使用时,但我们无法确定函数是在c还是cpp里面被定义,也就无法确定是否要将函数声明在extern "C"里,所以,我们应该添加 xxx.h
这样,可以将mytest()的实现放在.c或者.cpp文件中,可以在.c或者.cpp文件中include "test.h"后使用头文件里面的函数,而不会出现编译错误。一般情况下,只需要把_cpluscplus和extern "C"的关键字放到h文件就行了,c文件和cpp文件包含这个头文件,而不需要在加入这两个关键字。
|