介绍c++中的extern “C”
·
测试:
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;
}
更多推荐

所有评论(0)