测试:

c函数:   void MyFunc(){}            被编译成函数: MyFunc
c++函数: void MyFunc(){}            被编译成函数: _Z6Myfuncv
c++函数: extern "C" void MyFunc(){} 被编译成函数: MyFunc

由于c++中需要支持函数重载,所以c和c++中对同一个函数经过编译后生成的函数名是不相同的,如果在c++中调用一个使用c语言编写模块中的某个函数,那么c++是根据c++的名称修饰方式来查找并链接这个函数,那么就会发生链接错误

extern "C"的主要作用就是为了实现c++代码能够调用c语言代码。
加上extern "C"后,这部分代码编译器按c语言的方式进行编译链接,而不是按c++的方式。

使用方式:

extern "C" { 
	// 多个函数声明或定义 
}

extern "C" 返回类型 函数名(参数列表);

注意事项

  • extern "C"修饰的函数不能重载
  • 不能用于类、类成员函数
  • extern "C"只能用于全局作用域 不能用于局部变量或函数内部

应用场景

  • c++调用c库
  • 封装c接口 给其他语言使用
  • 跨语言混合编程 (如c与c++混合、嵌入式、操作系统开发)

条件编译

// 使用#ifdef __cplusplus判断是否是C++环境
// 如果是C++,就用`extern "C"`包裹函数声明,确保C++以C方式链接这些函数

#ifdef __cplusplus 
extern "C" { 
#endif 

// 函数声明 

#ifdef __cplusplus 
} 
#endif

用法1:
不在c文件中使用extern

// MyModule.h
#include<stdio.h>

void MyFunc1();
void MyFunc2();

// MyModule.c
#include "MyModule.h"
void MyFunc1(){ printf("c hello world!\n"); }
void MyFunc2(){ printf("c hello world2!\n"); }

// MyTest.cpp
#include<iostream>
using namespace std;

//使用extern "C" 包裹头文件
extern "C" {
	#include "MyModule.h"
}

int main()
{
	MyFunc1();
	MyFunc2();
	cout<<"c++ hello world"<<endl;
	return 0;
}

或者这样

// MyTest.cpp 
#include<iostream>
using namespace std;

//不包含头文件 直接使用 这对文件存放位置有要求
extern "C" void MyFunc1();
extern "C" void MyFunc2();

int main()
{
	MyFunc1();
	MyFunc2();
	cout<<"c++ hello world"<<endl;
	return 0;
}

用法2:
在c文件中使用extern

// MyModule.h
#include<stdio.h>

extern "C" { 
 void MyFunc1();
}
extern "C" void MyFunc2();

// MyModule.c
#include "MyModule.h"
void MyFunc1(){ printf("c hello world!\n"); }
void MyFunc2(){ printf("c hello world2!\n"); }

// MyTest.cpp
#include<iostream>
#include "MyModule.h"
using namespace std;

int main()
{
	MyFunc1();
	MyFunc2();
	cout<<"c++ hello world"<<endl;
	return 0;
}

用法3:
使用条件编译

// MyModule.h
#include<stdio.h>

#ifdef __cplusplus 
extern "C" { 
#endif 

void MyFunc1();
void MyFunc2();

#ifdef __cplusplus 
} 
#endif

// MyModule.c
#include "MyModule.h"
void MyFunc1(){ printf("c hello world!\n"); }
void MyFunc2(){ printf("c hello world2!\n"); }

// MyTest.cpp
#include<iostream>
#include "MyModule.h"
using namespace std;

int main()
{
	MyFunc1();
	MyFunc2();
	cout<<"c++ hello world"<<endl;
	return 0;
}
Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐