C++和C混编时变量和函数的定义和使用

背景

项目中经常遇到C++和C语言混编的情况,例如性能要求必须使用C语言实现功能,开发要求使用C++实现界面。这种情况下,会出现很多C++和C混编问题,下面就我自己的项目经验谈谈可能遇到的问题和解决方法,如果有误或不当之处还请海涵并请不吝指教。

问题及解决

原因

出现问题的根源主要包含以下两方面:

  1. C++和C使用不同的编译器,而编译器对变量和函数有不同的符号表示方法;
  2. C++是C的升级,对C有很多扩展,而这些扩展C不适用;

问题

  1. 变量和函数
    C++和C有不同的编译器,二者对变量名有不同的符号表示,例如对函数
    int add(int a, int b);
    C编译器对以上两个函数编译的结果可能都是_add,因而C无法函数重载,而C++编译器为了实现函数重载编译的结果可能是

    add@@XBJJJ@D
    add@@XCJJJ@D

    因此C++调用C语言编译的函数或变量时无法找到符号对应的函数或变量。解决方法就是extern “C”,具体写法如下:

    
    #ifdef __cplusplus
    
    extern "C"
    {
    
    #endif
    
    /* ...... */
    /* C code */
    /* ...... */
    
    #ifdef __cplusplus
    
    }
    
    #endif
    

    extern "C"的原理网上有很多解释,在这里不再赘述。

  2. bool类型定义和使用
    标准C中没有bool类型的定义,而C++中定义了bool类型,因此在混编中C源文件会出现类似于“bool,truefalse未定义”的错误。解决方法如下:

    
    #ifndef __cplusplus
    
    typedef    char     bool;
    
    #define    true     1
    
    
    #define    false    0
    
    
    #endif
    
  3. VS环境下混编预编译头
    Visual Studio环境下有默认的预编译头stdafx.h,C++工程中加入C源文件时,默认也会使用stdafx.h与编译头,编译无法通过

    error C1853:“xxx.pch”预编译头文件来自编译器的早期版本,或者预编译头为 C++ 而在 C中使用它(或相反)

你可能感兴趣的:(C/CPP)