使用c和C++混合编程中,除了要注意这些以外:
在混合编译时,需要注意以下几点:
1、C文件扩展名必须为.C, C++文件扩展名必须为.CPP, 头文件扩展名必须为.h。 如果源文件的扩展名使用错误,会导致编译出错。
2、C语言的头文件,需要加上如下条件编译及限制代码:
#ifdef __cplusplus
extern "C" {
#endif
//原本的头文件内容。
#ifdef __cplusplus
}
#endif
其功能为,当使用c++编译器编译时,会添加extern "C" {}限制。 这样才可以使C语言的函数声明被C++正确识别。
3、所有C++文件中需要被C调用的函数,在定义和声明时都需要加上
extern "C"
可以是单独的函数,比如
extern "C" void func_cpp_for_c(void)
{
//...
}
也可以是程序段,比如
extern "C"{
void func1()
{
}
void func2()
{
}
}
会遇到warning:#223-D:function “xxxxxxx” declared implicitly 这种警告,虽然不影响程序运行,但是看着还是很烦人的。在工程中,因为c的部分要调用C++写的函数,如果直接包含头文件(许多论坛文章给出了这种方法,但是我觉得应该是限于一种语言环境),就会报错,因为c和C++的编译方式确实有所差别。这种警告发生的原因是:
1 没有把函数所在的c文件生成.o目标文件
2 在函数所在的c文件中定义了,但是没有在与之相关联的.h文件中声明
在头文件中定义的数据只能被其他文件包含一次,但是函数可以被其他函数重复包含多次;因此,一般情况下把数据和函数分别定义在不同的头文件中;如果定义在同一个头文件中,那么在重复包含函数的文件中使用extern function来包含相关函数。
解决方案是在使用的函数的文件中,使用extern function声明来消除警告。如一个函数定义在cpp中,但是要c文件要调用,就在c文件的前面声明这个函数,这样就可以消除警告了。
产生这个警告的原因本质是编程的时候,代码堆叠造成,没有一开始完善的设计,c和c++分别进行了增量开发,所以会有类似这种不兼容的问题。