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

  • 相关阅读:
    python CST中国标准时间格式转换
    pytest+报告插件
    getopt实现命令行
    初识Redis
    python list 切片及翻转的使用
    mysql中information_schema表
    获取两个字符串中最长的相同子串
    mongodb数据库备份
    VS2005下边不能使用target>remote tool解决方法
    wince LoadDriver tool
  • 原文地址:https://www.cnblogs.com/javawebsoa/p/3095484.html
Copyright © 2020-2023  润新知