C++代码中如何调用写好的C接口?你可能想知道,C++不是与C兼容吗?直接调用不行吗?这里我们先压表,看看C++是如何调用C代码接口的。C++如何调用C接口?为什么会出现这种情况?想象一下,有些接口是用C实现的,提供了库,那么在C++中如何使用呢?我们先不做任何区分,先看看常见的情况会发生意想不到的事情。先提供一个C接口:#include"test.h"voidtestCfun(){printf("Iamcfun\n");return;}为了简单起见,我们这里就不做静态库或者动态库了,我们是这样的编译成C目标文件:gcc-ctest.c还提供了头文件test.h:#includevoidtestCfun();我们的C++代码调用如下:#include"test.h"#includeusingnamespacestd;intmain(void){/*调用C接口*/cout<<"starttocallcfunction"<extern"C"{voidtestCfun();}这里,用extern"C"包裹testCfun接口,告诉编译器这是C代码,你要把它当成C代码来处理。再次编译:$g++-omainmain.cpptest.o$./mainstarttocallcfunctionIamcfunendtocallcfunction看终端输出,完美!优化虽然上面的C接口可以被C++正常调用,但是如果这个C接口要被代码调用呢?添加main.c内容编译如下//main.c#include"test.h"intmain(void){/*调用C接口*/testCfun();return0;}:$gcc-omainmain.ctest.cInfileincludedfrommain.c:2:0:test.h:2:8:error:expectedidentifier'('beforestringconstantextern"C"{^Infileincludedfromtest.c:2:0:test.h:2:8:error:expectedidentifier'('beforestringconstantextern"C"{不出意外,又报错了,显然C语言中没有extern"C",所以为了让test.c的代码能够被C++和C都调用,需要改写为如下:#include#ifdef__cplusplusextern"C"{#endifvoidtestCfun();#ifdef__cplusplus}#endif这里使用__cplusplus宏来控制是否需要extern"C",如果是C++编译器,则extern"C"部分会被pre-preparedProcess进去,这样test.c的代码在C++和C中都可以使用。去你的C工程代码头文件看看有没有这样的代码段?问题为什么我们在C++代码中你可以直接调用一些标准C主函数中的库函数?即使在main函数中调用printf等函数,也不会导致链接错误。因为库函数已经有了类似的处理。如果还是不能确定,可以预处理:$g++-Emain.imain.cpp,在生成的main.i文件中查找是否有extern"C"。综上所述,C++支持重载,而C不支持。C++不能直接调用C代码写的接口,所以如果你的C代码想被C或C++调用,别忘了extern"C"。