条款三十四:如何在同一个程序中结合C++和C

来源:互联网 发布:网络数据分析工具解析 编辑:程序博客网 时间:2024/06/14 09:31

条款三十四:如何在同一个程序中结合C++和C

  这一条款说明一些当你希望在C++文件中使用C代码时需要注意的问题。

一、Name Mangling(名称重整)

  在C语言中不支持重载而C++中支持重载,这就意味着即便你直接将你的C语言代码放入C++即便代码中出现了多个名称相同的方法也可能造成编译器并不报错和警告的情况的出现。而且C++编译器为了支持重载都会把函数名进行重整而,函数名称的重整可能给我们的程序带来一定的麻烦因此可以使用extern “C”来将函数声明为C特点的函数,要求编译器以C函数对待。

  下面三种方式都可以,第三种更具移植性:

    extern "C" void func();    extern "C"    {        void func_1();        void func_2();    }    #ifdef __cplusplus    extern "C"{    #endif        void fun_1()        void fun_2()    #ifdef __cplusplus    }    #endif

二、Statics的初始化

  这里涉及的问题是静态成员的初始化和构造函数的执行在main函数之前,但是我们一般以main函数为程序的执行入口有时我们可以这样做:

    extern "C" int realMain(int argc, char** argv);    int main(int argc, char** argv)    {        return realMain(argc, argv);    }

  但是这个问题并不是这么简单就能解决的,更多的工作可能需要你去做。

三、动态内存分配

  C++中动态内存分配使用new销毁用delete,而C语言中动态内存分配用malloc销毁用free,这里只要注意对应关系就好,不要弄混。

四、数据结构的兼容

  C++中的struct和C语言中的struct相比拥有同等的结构即便在C++中添加了非虚函数,这也不会影响内存布局因此二者之间进行交流几乎不影响兼容性。

  简单的说是一下五条:

  • 确定你的C++和C编译器产出兼容的目标文件;
  • 将双方都使用函数声明extern “C”;
  • 如果可能尽量在C++中撰写main;
  • new申请的用delete删除,malloc申请的用free删除;
  • 两个语言之间的数据结构的交流限制于C所能理解的范围。
0 0
原创粉丝点击