使用extern “C”可解决C++调用C函数时的链接问题,它关闭名称修饰,确保C与C++函数按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_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++函数
反过来,如果想让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++混合编程的基础手段,理解其原理有助于跨语言模块集成。