请记住以下几个简单守则:
- 确定你的C++和C编译器产出兼容的目标文件(object files)。
- 将双方都使用的函数声明为
extern “C”
。 - 如果可能,尽量在C++中撰写
main
。 - 总是以
delete
删除new
返回的内存;总以free释放malloc
返回的内存。 - 将两个语言间的“数据结构传递”限制于C所能了解的形式;C++ structs如果内含非虚函数,倒是不受此限。
Name Mangling(名字重整)
绝对不要重整以其他语言撰写的函数的名称——不论是C,assembler,FORTRAN,Lisp,Forth,COBOL,还是其他任何语言;
要压抑name mangling,必须使用C++的extern “C”
指令:
extern "C"
void drawLine(int x1,int y1,int x2,int y2);
extern “C”可以施行于一整组函数身上,只要以花括号封住头尾范围即可:
extern "C"
{void drawLine(int x1,int y1,int x2,int y2);void twiddleBits(unsigned char bits);void simulate(int iterations);...
}
加入__cplusplus,这个符号只针对C++才有定义,即用于C++时含有extern “C”
;用于C时无:
#ifdef __cplusplus
extern "C"
{
#endifvoid drawLine(int x1,int y1,int x2,int y2);void twiddleBits(unsigned char bits);void simulate(int iterations);...
#ifdef __cplusplus
}
#endif
Statics的初始化
- static class对象、全局对象、namespace内的对象以及文件范围内的对象,其构造总是在main之前就获得执行,这个过程称为static initialization;
- 通过static initialization产生出来的对象,其析构必须在所谓的static destruction过程中被调用,发生在main结束之后。
如果能够,还是尽量在C++中撰写main的好:
extern "C"
int realMain(int argc,char* argv[]); //将C main重命名的realMainint main(int argc,char* argv[])以C++语言完成此函数
{realMain(argc,argv);
}
动态内存分配
程序的C++部分使用new
和delete
,程序的C部分则使用malloc
和free
,唯一需要做的就是严密地区分开二者。
数据结构的兼容性
如果你的C++和C编译器有着兼容的输出,两个语言的函数便可以安全地交换对象指针、non-member函数指针、或是static函数指针。很自然的,structs以及内建类型的变量也可以安全跨越C++/C边界。
如果在C++和C之间传递数据,需要限定在C语言支持范围内。