浅析extern C
以下在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++的方式。
在C++中调用C代码
第一种方式
直接在cpp文件中 头文件下方使用extern "C"
cpp
TestExternC.cpp
#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
using namespace std;
extern "C" void func1();
extern "C" int func2(int a, int b);
第二种方式
在所引用第C语言头文件中使用extern "C",然后在cpp文件中包含C语言所写的头文件就可以正常链接到了
cpp
MyModule.h
#ifndef MYMODULE_H
#define MYMODULE_H
#include<stdio.h>
#if __cplusplus
extern "C" {
#endif // __cplusplus
void func1();
int func2(int a, int b);
#if __cplusplus
}
#endif // __cplusplus
#endif // MYMODULE_H
注意
在C中调用C++代码
要想在C中调用C++代码同样的也要把C++代码按照C语言的方式进行编译,使用的依然是extern "C",把需要在C中使用的C++函数使用 extern "C"{}
包裹起来就行了