关于C和C++编译器引发的一系列问题

参考资料http://blog.csdn.net/a125930123/article/details/53558041
__cplusplus是一个预定义宏,只要你的文件后缀名是.cpp,则该宏便有了。但是,我们通常需要在C++文件了只用一些C的函数,由于C++的多态特性,同名函数可以执行不同的功能,为了加以区分,则会在编译的时候修改函数名,而这和C编译的结果就不一样了,从而导致通常在C++文件里调用C函数是提示无法连接,最近,我就遇到了。
我的实际情况是,基于onvif网关(C实现)开发一个人流统计(使用opencv)的系统,我没有直接新建工程,而是在原有的C语言(.c文件)写的一个工程直接添加代码:
#include//这是C++版本
using namespace cv;

但是,问题出现了,opencv库无法使用,但是我之前在其他工程是铭心啊测试成功的,所以库没有问题,后来通过多方求助,.c文件是直接使用C编译器,对于C++版本的opencv当然无法使用了,很直观的想法,通过修改后缀名为.cpp来使用C++编译器,果然,opencv的问题迈过去啦,虽然产生了其他问题,不知道是进步了还是退步,但是,至少问题在改变,心里总是舒服的,这就是工程师(程序员),不安天命,不安于现状,于动荡中求生存。如果一直明对同一个难题,相信很多人都会崩溃的,哈哈哈。
接下来,说一说新产生的问题,opencv问题解决之后,导致之前很多C函数无法链接成功,这个问题很熟悉啦,无法连接通常是没声明啊,但是相关函数的头文件明明是包含了的啊,这就涉及到编译器的显示指定啦。

# ifdef __cplusplus 
extern "C" {
# endif
//此处包含相关函数声明
# ifdef __cplusplus 
}
# endif

因为我们采用了C++编译器(通过修改后缀名为.cpp),原先的所有文件都转而采用C++编译器了,这就导致原先的很多C函数在编译之后名字改变了,导致后续的调用产生无法链接的错误(找不到声明),那怎么办呢?此处有两种方法:
1.找到函数在编译后的新函数名字,然后去修改调用此函数的代码
2.强制使用C编译器,而不是使用C++编译器。
显然,第二种方法会好很多,需要修改的内容也少,那就使用第二个方法吧。不管你用什么方法,先找到出错的函数的声明文件,然后使用

# ifdef __cplusplus 
extern "C" {
# endif
//此处包含相关函数声明
# ifdef __cplusplus 
}
# endif

包含函数声明的主体部分,这样就强制使用C++编译器了。但是,如果有人就是找不到声明的头文件呢,怎么办,你要是懒得去找,那就直接新建一个声明文件,同样用上名的代码包含声明函数,如此,所有问题也就解决了。

你可能感兴趣的:(C++,编程工具应用)