有时要实现某些功能,会摘取部分别人成熟的代码,当代码量比较大时,难于避免C和C++代码混合编程的问题,下面是一些注意点。
1、预编译问题
针对VC,有预编译的概念,如果Import进来的C文件没有使用预编译,可以单独把此C文件的预编译特性关掉。右键此C文件,Setting->C/C++,在Category中选“Precompiled Headers”,单选“Not using precompiled headers”可。
2、找不到符号的问题
由于C++添加了重载等机制,会对函数进行自动改名,导致链接时找不到符号。遇到此问题时请在相关函数中使用extern "C" {}括起来即可。
如一个经典的情况是:某个CPP文件中要使用某个由C实现的函数,首先在CPP中include此函数的声明:#include "XX.h",而此函数的实现是在"XX.C"文件中。结果CPP编译时,默认是会对函数重命名处理的,而C文件编译时,默认没有函数重命名处理,导致链接时找不到符号。此时可以这样包含XX.h文件:
extern "C" {
#include "XX.h"
}
另外,也要注意C++的static关键字和inline特性,inline特性有时会引起Debug能链接过,但Release链接不过的问题,因为Debug是不作优化的,所有函数都没有实际inline,而Release会按编译器的优化策略对部分函数inline处理。如果遇到此种情况,也可以单独对指定CPP文件设置非inline特性。
3、静态库/动态库的问题
只要用的编译器一致,C++和C互相链接不存在静态库问题,动态库就更不用说了,因为动态库是系统提供的特性。但是如果编译不一样的话,会有些问题,应避免使用,如VC6和VC2005。