Skip to content

浅析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"{} 包裹起来就行了