前言如何在C++代码中调用写好的C接口?您可能想知道,C++不是与C兼容吗?直接调用不行吗?这里我们先压表,看看C++是如何调用C代码接口的。C++如何调用C接口?为什么会出现这种情况?想象一下,有些接口是用C实现的,提供了库,那么在C++中如何使用呢?我们先不做任何区分,先看看常见的情况会发生意想不到的事情。先提供一个C接口://来源:公众号【编程珠玑】//博客:https://www.yanbinghu.com//test.c#include"test.h"voidtestCfun(){printf("Iamcfun\n");return;}这里为了简单起见,就不做成静态库或者动态库了。有兴趣的可以参考《静态库制作》自己试一试。我们这里编译成C目标文件:gcc-ctest.c还提供了一个头文件test.h:#includevoidtestCfun();我们的C++代码调用如下://来源:公众号【编程诸暨】博客:https://www.yanbinghu.com//main.cpp#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接口要被C代码调用呢?添加main.c内容如下//main.c#include"test.h"intmain(void){/*调用C接口*/testCfun();return0;}compile:$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"部分会被Preprocess进去,这样test.c的代码在C++和C中都可以使用。去你的C工程代码头文件看看有没有这样的代码段?问题why我们在C++中可以调用一些标准的C库函数吗直接在代码中编辑?即使在main函数中调用printf等函数,也不会导致链接错误。因为库函数已经有了类似的处理。如果还是不能确定,可以预处理:$g++-Emain.imain.cpp,在生成的main.i文件中查找是否有extern"C"。综上所述,C++支持重载,而C不支持。C++不能直接调用C代码写的接口,所以如果你的C代码想被C或C++调用,别忘了extern"C"。那么问题来了,C是如何调用C++接口的呢?