C与C++混合编程

转自:http://www.cnblogs.com/hanyan225/archive/2011/04/10/2011686.html

这年头啊,面向对象简直漫天飞,连C语言都有面向对象版--C++。当然啦,这也不能怪谁,面向对象的思想还是比较接近自然思维习惯的,随着编程规模及逻辑思维要求不断提高的今天,还真是需要面向对象的想法。

  可问题来了,不少我们这样的工程师(还是有点实力的),习惯了C,对C++呢,也有那么一点感冒,所以啊,有时还真是需要将已有的C语言代码模块与C++语言代码模块相互链接最快的办法就是将C语言代码当做C++语言来编译。但在许多情况下还是不得不使用C语言和C++语言进行编程。由于C语言和C++语言在函数的命名和调用方式均有不同,如果想在C++源码中调用C语言模块的函数,那就需要做一些特殊的声明了,如下:

extern "C" int func();//声明fun为外部的C函数

  经过的声明处理,编译器就知道这个函数必须按照C语言的方式调用,从而为其生成相应的目标代码。当然啦,如果有很多,就丢到一起去声明吧:

extern "C" {

   int func();

   void func2(int ,int);

}

  如果你编程时间足够长,换句话说,就是经验足够丰富(嘿嘿,我还凑合吧),你就应该知道模块函数的接口通常都是放到头文件中去声明,这样就可以保证供多个源文件引用。那新的问题又来了,如果一个头文件既被C++源文件引用又被C源文件引用,则上述声明就出现了问题,因为C编译器不认识extern后的字符串C。解决这个问题的方法就是在头文件加入如下代码,使之对C和C++编译器通用:

#ifdef __cplusplus
extern "C" {   //C编译器看不到这一行
#endif
     int func1();
     void func2(int ,int);
#ifdef __cplusplus 
}    //C编译器看不到这一行
#endif

这里用到一个宏定义__cplusplus,如果是通过C编译器进行预处理,则它没有定义。只有用C++编译器进行预处理,则它有定义。这样就可以把代码分为两种情况进行编译,从而实现对C和C++编译器的通用性。

posted @ 2014-12-30 17:09  oMengLvRong  阅读(165)  评论(0编辑  收藏  举报