说到 extern 关键字,一般就想到三种情况:
- extern 修饰函数
- extern 修饰变量
- extern "C"
我们先来讲 extern "C"
核心背景
C++ 的名字修饰,编译器会把函数名和参数类型拼接成一个新名字,目的是支持函数重载。而 C 语言没有函数重载,编译器对函数名的处理非常简单:直接用原函数名,不会加任何参数相关的修饰。这就导致一个问题:如果 C++ 代码想调用 C 语言写的函数(比如 C 写的库),或者 C 代码想调用 C++ 写的函数,因为名字处理方式不同,链接时会找不到函数(报'未定义的引用'错误)。
extern "C" 的核心作用
extern "C" 是 C++ 的专属语法,它告诉 C++ 编译器:对这个函数,按照 C 语言的规则处理(不做名字修饰),这样就能和 C 语言代码兼容。
简单说:extern "C" 是 C++ 和 C 之间的'翻译官',解决两者函数名不兼容的问题。即改变函数名的编译规则(按 C 语言来),解决 C/C++ 互调的链接问题。
代码示例:怎么用 extern "C"
场景 1:C++ 中调用 C 语言写的函数
假设你有一个 C 语言文件 c_func.c:
// c_func.c - 纯 C 语言代码
#include <stdio.h>
// C 语言的普通函数,编译器处理后名字就是 add
int add(int a, int b) {
return a + b;
}
然后在 C++ 文件 cpp_main.cpp 中调用这个 C 函数:
// cpp_main.cpp - C++ 代码
#include <iostream>
using namespace std;
// 关键:用 extern "C"声明这个函数是 C 语言风格的(不做名字修饰)
extern "C" {
int add(int a, int b); // 声明 C 语言的 add 函数
}
int main() {
cout << (, ) << endl;
;
}

