c++中的extern关键字

extern 是 C++ 中一个非常重要的存储类说明符,它的核心作用 是声明一个变量或函数是在别处定义的(通常是在另一个源文件或更早的代码位置),从而告诉编译器:"这个东西存在,它的定义不在我这里,别报错,链接时会找到它。"简单来说,extern 主要解决 C++ 项目中的跨文件全局变量/函数共享与 C 语言混合编程两大问题。

1. 跨文件共享全局变量/函数

在 C++ 中,全局变量默认具有外部链接性,但如果你想在 fileA.cpp 中定义,在 fileB.cpp 中使用,就必须在 fileB.cpp 中用 extern 声明它。

cpp 复制代码
// File: globals.h
extern int g_score;          // 声明(不定义)
void printScore();
cpp 复制代码
// File: globals.cpp
#include "globals.h"
int g_score = 100;           // 定义(分配内存)
void printScore() {
    std::cout << g_score;
}
cpp 复制代码
// File: main.cpp
#include "globals.h"
int main() {
    g_score = 200;           // 可以修改
    printScore();            // 输出 200
    return 0;
}

2. 让 C++ 调用 C 语言代码

C++ 编译器为了支持函数重载,会将函数名编译成复杂符号(如 func 变成 _Z4funcv)。而 C 语言没有重载,符号名就是函数名本身。所以如果不加 extern "C",C++ 链接器会去找修饰后的符号名,而 C 编译的 .o 文件里只有原始名,导致链接错误

cpp 复制代码
// 假设这是 C 语言提供的库(无法修改源码)
// my_c_library.c
void print_hello() { printf("Hello from C"); }

// 在 C++ 中使用时,必须用 extern "C" 包裹声明
extern "C" {
    #include "my_c_library.h"  // 或者直接声明
    void print_hello();
}

int main() {
    print_hello();  // 正确调用 C 函数
    return 0;
}

3. 改变 const 常量的默认链接性

在 C++ 中,顶层 const 全局变量默认具有"内部链接性"(即仅在当前文件有效)。如果你想让 const 变量跨文件共享,必须加上 extern。

cpp 复制代码
// File: config.cpp
extern const int MAX_SIZE = 1024;  // 必须加 extern 才能外部可见

// File: main.cpp
extern const int MAX_SIZE;         // 声明
int arr[MAX_SIZE];                 // 使用
相关推荐
C++ 老炮儿的技术栈4 小时前
我们在设计tcp协议时,要传一个字符串过去,报文:头十长度十内容,是否要把‘\0‘也填入,长度是否包含‘\0‘
开发语言·数据结构·c++·mfc·c
传奇开心果编程4 小时前
【Rust入门练中学】第2课:变量、可变性与常量
开发语言·学习·rust
zr想努力4 小时前
从0开始配置Perforce4环境
开发语言
幸运小圣6 小时前
PointerEvent 常用属性与事件整理【JavaScript】
开发语言·javascript·ecmascript
长谷深风1116 小时前
评测AI Agent:三种裁判各司其职
java·大数据·开发语言·人工智能·ai agent
边境悍匪6 小时前
蜗牛学苑 Java 智能体学习 Day42|项目周开发技术汇总 1 思维导图复盘
java·开发语言·spring boot·学习·spring
君顾17 小时前
本地托管机构管理源码实战:需求拆解、数据建模与多端部署
java·开发语言·托管
传奇开心果编程8 小时前
【Rust入门练中学】 第3课:数据类型
开发语言·学习·rust
泡泡鱼(敲代码中)9 小时前
MySQL 学习笔记:DCL、函数与约束 —— 安全、效率、完整性的三板斧
开发语言·笔记·sql·学习·mysql·gitee
I_belong_to_jesus9 小时前
std::unique_ptr成员函数用法
c++