使用extern “C”可解决C++调用C函数时的链接问题,它关闭名称修饰,确保C与C++函数按C规则链接,实现混合编程。

在C++项目中调用C语言函数时,由于C++支持函数重载,编译器会对函数名进行名称修饰(name mangling),而C编译器不会。这会导致链接阶段找不到对应的函数符号。为了解决这个问题,C++提供了 extern “C” 机制,用于告诉编译器以C语言的方式处理函数声明和链接。
extern “C” 的作用
extern “C” 的主要作用是关闭C++的名称修饰,使函数按照C语言的规则进行编译和链接。这样,C++代码就能正确调用由C语言实现的函数,也能让C代码调用C++中按C方式导出的函数。
注意: C不支持函数重载,因此用 extern “C” 声明的函数不能被重载。
如何在C++中调用C函数
假设你有一个用C语言编写的函数库,包含头文件 my_c_lib.h 和源文件 my_c_lib.c。
立即学习“C语言免费学习笔记(深入)”;
my_c_lib.h:
#ifndef MY_C_LIB_H#define MY_C_LIB_Hvoid hello_from_c();int add(int a, int b);
endif
my_c_lib.c:
#include "my_c_lib.h"void hello_from_c() {printf("Hello from C!n");}
int add(int a, int b) {return a + b;}
在C++文件中调用这些C函数,需要使用 extern “C” 包裹C头文件的包含:
main.cpp:
#include using namespace std;// 告诉C++编译器:以下函数按C方式链接extern "C" {
include "my_c_lib.h"
}
int main() {hello_from_c();cout << "3 + 4 = " << add(3, 4) << endl;return 0;}
说明: 使用 extern “C” { #include “xxx.h” } 可以确保头文件中所有函数都按C语言方式声明。
如何让C代码调用C++函数
反过来,如果想让C语言代码调用C++中实现的函数,也需要使用 extern “C” 来定义该函数,防止名称修饰。
my_cpp_func.cpp:
extern "C" void hello_from_cpp() { cout << "Hello from C++!" << endl;}
然后在C文件中声明并调用:
main.c:
#include// 声明为C函数,实际由C++提供extern void hello_from_cpp();
int main() {hello_from_cpp();return 0;}
注意: 被 extern “C” 修饰的C++函数内部仍可使用C++特性(如new、类、异常等),但函数接口必须符合C语言规范——不能使用重载、引用、命名空间等C不支持的特性。
编译混合程序
编译时需使用C++编译器链接所有目标文件。例如:
# 编译C文件gcc -c my_c_lib.c -o my_c_lib.o编译C++文件
g++ -c main.cpp my_cpp_func.cpp -o main.o my_cpp_func.o
链接成可执行文件
g++ main.o my_c_lib.o my_cpp_func.o -o mixed_program
关键点: 即使有C文件,最终链接必须用 g++,以确保C++运行时和标准库被正确引入。
基本上就这些。使用 extern “C” 是实现C与C++混合编程的基础手段,理解其原理有助于跨语言模块集成。
以上就是c++++中如何调用C语言函数_extern “C”实现C与C++混合编程的详细内容,更多请关注创想鸟其它相关文章!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1476187.html
微信扫一扫
支付宝扫一扫