zoukankan      html  css  js  c++  java
  • 如何在同一个程序中混合使用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可支持的概念上。

  • 相关阅读:
    智能算法浅介模拟退火,遗传算法,禁忌搜索,神经网络等
    shell 字符串操作(长度,查找,替换)详解
    如何实现两个文件相减的功能(剔除)
    shell数值操作(四则运算,浮点数,科学计数法)awk,bc
    CUDA程序优化的记录
    随机化算法模拟退火
    (转)AspNetPager 样式以及使用(漂亮)
    (转)做项目时,如何做比较美观大方的数据输入窗体
    (转)26个Jquery使用小技巧(jQuery tips, tricks & solutions)
    (转)【译】Asp.net MVC并不仅仅只是Linq to SQL
  • 原文地址:https://www.cnblogs.com/javawebsoa/p/3095484.html
Copyright © 2011-2022 走看看