背景
项目中经常遇到C++和C语言混编的情况,例如性能要求必须使用C语言实现功能,开发要求使用C++实现界面。这种情况下,会出现很多C++和C混编问题,下面就我自己的项目经验谈谈可能遇到的问题和解决方法,如果有误或不当之处还请海涵并请不吝指教。
问题及解决
原因
出现问题的根源主要包含以下两方面:
- C++和C使用不同的编译器,而编译器对变量和函数有不同的符号表示方法;
- C++是C的升级,对C有很多扩展,而这些扩展C不适用;
问题
变量和函数
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"
的原理网上有很多解释,在这里不再赘述。bool类型定义和使用
标准C中没有bool
类型的定义,而C++中定义了bool
类型,因此在混编中C源文件会出现类似于“bool
,true
和false
未定义”的错误。解决方法如下:#ifndef __cplusplus typedef char bool; #define true 1 #define false 0 #endif
VS环境下混编预编译头
Visual Studio环境下有默认的预编译头stdafx.h
,C++工程中加入C源文件时,默认也会使用stdafx.h
与编译头,编译无法通过error C1853:“xxx.pch”预编译头文件来自编译器的早期版本,或者预编译头为 C++ 而在 C中使用它(或相反)