如何在同一个程序中混合使用C++和C

如何在同一个程序中混合使用C++和C
1.名变换
名变换,就是C++编译器给程序的每个函数换一个独一无二的名字。
由函数名和参数组合生成一个新的名字,这样为了支持函数重载
在C语言中,这样的做法是不必要的,因为它没有重载函数。
这样就存在一个问题:就是当你在C++环境中调用C函数库中的函数时,比如一个drawLine(int x,int y)。经过C++编译器后在obj中的函数名称可能是drawLine_int_int,这样当你试图将obj文件链接为程序时,将得到一个错误。因为链接程序无法在C函数库中找到drawLine_int_int。
要解决这个问题,你需要一种方法来告诉C++编译器不要在这个函数上进行名变换。你不期望对用其它语言写的函数进行名变换,如C、汇编、Fortran、LISP、Forth或其它。
总之,如果你调用一个名字为drawLine的C函数,它实际上就叫drawLine,你的obj文件应该包含这样的一个引用,而不是引用进行了名变换的版本。
extern "C"
void drawLine(int x1, int y1, int x2, int y2);
不要以为有一个extern 'C',那么就应该同样有一个extern 'Pascal'什么的,这里extern ‘C’应看做是声明这个函数应该被当做好像是C写的一样来进行调用,要禁止名称变换。
你甚至可以在C++函数上申明extern 'C'。这在你用C++写一个库给使用其它语言的客户使用时有用。通过禁止这些C++函数的名变换,你的客户可以使用你选择的自然而直观的名字,而不用使用你的编译生成的变换后的名字。
如果你有一堆函数不想进行名变化,那么你可以简单的通过加一对大括号来实现

extern "C" 
{ 
// disable name mangling for
// all the following functions
void drawLine(int x1, int y1, int x2, int y2);
void twiddleBits(unsigned char bits);
void simulate(int iterations);
...
}

通过定义一个宏,我们可以轻松的控制是否需要添加extern "C"。比如程序放在C++编译器下编译时我们需要添加extern "C",而在C编译器下编译时就不需要了。
下面的功能就是,当我们定义了_cplusplus这个宏的话,说明是在C++环境下,那么条件编译指令将被执行,也就是定义extern "C",否则是在C环境下,不会定义。

#ifdef __cplusplus
extern "C" {
#endif
void drawLine(int x1, int y1, int x2, int y2);
void twiddleBits(unsigned char bits);
void simulate(int iterations);
...
#ifdef __cplusplus
}
#endif

这里我们还需要知道一点是,不同的编译器可能使用了不同的名称变换规则。所以当你链接由不同的编译器得来的obj的时候,如果出现链接错误,那就不要感到吃惊了。
2.动态内存分配
严格遵守:C++部分使用new和delete,C部分使用malloc和free。
new分配的内存使用delete释放,malloc分配的内存用free释放。
3.数据结构的兼容性
如果在C++和C之间传递数据,我们不能期望C的函数能够了解或支持C++的特性,也就是说它们的交互必须限定在C可支持的概念上。

posted @ 2013-05-23 20:03  javawebsoa  Views(732)  Comments(0Edit  收藏  举报