Loading... 一下测试在Linux下测试: * C函数在:void MyFunc(){}被编译成函数MyFunc * C++函数:void MyFunc(){}被编译成函数_Z6Myfuncv 通过这个测试,由于c++中需要支持函数重载,所以c和c++中对同个函数经过编译后生成的函数名是不相同的,这就导致了一个问题,如果在c++中调用一个使用c语言编写模块中的某个函数,那么c++是根据c++的名称修饰方式来查找并链接这个函数,那么就会发生链接错误,以上例,C++中调用MyFunc函数,在链接阶段会去找Z6Myfuncv, 结果是没有找到的,因为这个MyFunc函数是c语言编写的,生成的符号是MyFunc。 那么如果我想在C++调用c的函数怎么办?extern "C"的主要作用就是为了实现c++代码能够调用其他c语言代码。加上extern"C"后,这部分代码编译器按c语言的方式进行编译和链接,而不是按c++的方式。 比如一下代码: * main.cpp ```C++ #include<iostream> #include "Myadd.h" using namespace std; int main() { cout << Myadd(2, 3) << endl; return 0; } ``` * Myadd.c (这一块是C语言) ```C++ int Myadd(int a, int b) { return a + b; } ``` * Myadd.h ```C++ #pragma once extern int Myadd(int a, int b); ``` 我们现在编译是不能通过的。 <div class="tip inlineBlock success"> 解决方法:在函数声明的地方 extern后面加上 "C",即: 原来的: ```C++ extern int Myadd(int a,int b); ``` 修改为: ```C++ extern "C" int Myadd(int a,int b); ``` </div> ![](https://blog.fivk.cn/usr/uploads/2021/04/3320177589.png) 这样每个.c文件都需要加"C",而且有时候会忘记。为了以后写代码方便我们可以整体都用C语言的声明我们套壳,就像#ifndef放置头文件重复包含一样。 * .h文件 ```C++ #pragma once #if __cplusplus extern "C" { #endif //声明的函数放到里面就好了 int Myadd(int a, int b); #if __cplusplus } #endif ``` 最后修改:2021 年 04 月 11 日 © 禁止转载 打赏 赞赏作者 支付宝微信 赞 如果觉得我的文章对你有用,请随意赞赏