C++中如何调用C语言的代码实现 为什么要是用 extern C在进行C开发的时候由于C、C编译规则是不同的。C编译函数方法是使用mangle的技术。123456789101112voidfunc(intage) {}voidfunc(intage,intheight) {}/*如果有这两个函数要被调用在C语言中函数重载是不允许的那么在C中为什么可以呢。C中就是使用了mangle技术对函数重载的函数名加上编译器中自定义规则的表示符编译之后的函数名就会不一样。例如 func(int age) - func_int(int age)func(int age, int height) - func_int_int(int age, int height)*/而在C语言中是没有这个技术的所以如果我们想要调用C语言开发的一些API就需要使用extern C修饰C语言的函数声明。extern C 用法直接在函数前面加上extern C关键字123externCvoidfun() {printf(test);}如果有函数声明与函数实现要让函数声明被extern C修饰函数实现可以不修饰1234externCvoidfunc();voidfunc() {cout func() endl;}如果有多个函数要被extern C修饰可以直接用{}包裹12345678910externC{voidfunc();voidfunc1();}voidfunc() {cout func() endl;}voidfunc1() {cout func1() endl;}自定义C语言函数库但是我们每次使用C语言的API都用这个extern C修饰那是不是太麻烦了那我们学会了怎么去使用extern C我们可以在编写C语言API库的时候直接使用这个来修饰那么C再去调用的时候就不用这么麻烦了直接使用这个函数就可以了。123456789101112131415//在sum.h文件中定义sum函数externC{intsum(inta,intb);}intsum(inta,intb) {returna b;}//在main.cpp文件中包含这个库文件之后就可以直接使用了intmain(){cout sum(1, 2) endl;getchar();}但是这么定义的话就会产生另一个问题那么就是无法在C语言文件中调用这个库因为在C语言中是没有extern C这个关键字的。调用这个库就是直接把这个库的文件代码拷贝过来。例如1234567891011121314#include stdio.h#include sum.hexternC{intsum(inta,intb);}intsum(inta,intb) {returna b;}voidmain() {printf(%d, sum(3, 4));}那么我们就需要在定义这个sum库的时候加上一些约束规则让他在被C调用的时候加上extern C关键字在被C语言调用的时候去掉这个关键字。123456789101112131415161718//sum.h文件声明#ifndef __SUM_H#define __SUM_H#ifdef __cplusplusexternC{#endifintsum(inta,intb);#ifdef __cplusplus}#endif#endif//sum.c文件实现#include sum.hintsum(inta,intb) {returna b;}__cplusplus这个宏是C中特有的。它在加载C文件的时候会提前定义这个宏所以我们只要判断文件中是否有这个宏有的话就是C在调用没有的话就是C语言这样就可以很好地解决了这个混合调用的问题。