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

在C++项目中调用C语言函数时,由于C++支持函数重载,编译器会对函数名进行名称修饰(name mangling),而C编译器不会。这会导致链接阶段找不到对应的函数符号。为了解决这个问题,C++提供了 extern "C" 机制,用于告诉编译器以C语言的方式处理函数声明和链接。
extern "C" 的主要作用是关闭C++的名称修饰,使函数按照C语言的规则进行编译和链接。这样,C++代码就能正确调用由C语言实现的函数,也能让C代码调用C++中按C方式导出的函数。
注意: C不支持函数重载,因此用 extern "C" 声明的函数不能被重载。
假设你有一个用C语言编写的函数库,包含头文件 my_c_lib.h 和源文件 my_c_lib.c。
立即学习“C语言免费学习笔记(深入)”;
my_c_lib.h:
#ifndef MY_C_LIB_H #define MY_C_LIB_H <p>void hello_from_c(); int add(int a, int b);</p><h1>endif</h1><p>
my_c_lib.c:
#include "my_c_lib.h"
<p>void hello_from_c() {
printf("Hello from C!\n");
}</p><p>int add(int a, int b) {
return a + b;
}
在C++文件中调用这些C函数,需要使用 extern "C" 包裹C头文件的包含:
main.cpp:
#include <iostream>
using namespace std;
<p>// 告诉C++编译器:以下函数按C方式链接
extern "C" {</p><h1>include "my_c_lib.h"</h1><p>}</p><p>int main() {
hello_from_c();
cout << "3 + 4 = " << add(3, 4) << endl;
return 0;
}
说明: 使用 extern "C" { #include "xxx.h" } 可以确保头文件中所有函数都按C语言方式声明。
反过来,如果想让C语言代码调用C++中实现的函数,也需要使用 extern "C" 来定义该函数,防止名称修饰。
my_cpp_func.cpp:
extern "C" void hello_from_cpp() {
cout << "Hello from C++!" << endl;
}
然后在C文件中声明并调用:
main.c:
#include <stdio.h>
<p>// 声明为C函数,实际由C++提供
extern void hello_from_cpp();</p><p>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 <h1>编译C++文件</h1><p>g++ -c main.cpp my_cpp_func.cpp -o main.o my_cpp_func.o</p><h1>链接成可执行文件</h1><p>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++混合编程的详细内容,更多请关注php中文网其它相关文章!
c++怎么学习?c++怎么入门?c++在哪学?c++怎么学才快?不用担心,这里为大家提供了c++速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号