【C++ Miscellany】如何在同一个程序中结合C++和C

请记住以下几个简单守则:

  • 确定你的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"
{
#endif
	void 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重命名的realMain
 
int main(int argc,char* argv[])以C++语言完成此函数
{
	realMain(argc,argv);
}

动态内存分配

程序的C++部分使用newdelete,程序的C部分则使用mallocfree,唯一需要做的就是严密地区分开二者。

数据结构的兼容性

如果你的C++和C编译器有着兼容的输出,两个语言的函数便可以安全地交换对象指针、non-member函数指针、或是static函数指针。很自然的,structs以及内建类型的变量也可以安全跨越C++/C边界。

如果在C++和C之间传递数据,需要限定在C语言支持范围内。

  • 4
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值