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];                 // 使用
相关推荐
ESDWAN1 分钟前
SD-WAN 是什么?工作原理、适用场景与选型要点
开发语言·网络·数据库·架构·php
iCxhust23 分钟前
C#双时区时钟设计
开发语言·c#
小菜要扣篮24 分钟前
Ubuntu 下使用 vscode 打开 C++ 项目后,无法通过 F12 定位到定义问题解决
c++·vscode·ubuntu
wuminyu25 分钟前
JVM规范学习总结:class执行性能差异
java·linux·c语言·jvm·c++
sbjdhjd31 分钟前
从污点追踪断点到 PHP-FPM 请求队列:HIDS PHP WebShell 样本复盘
开发语言·网络安全·数据挖掘·渗透测试·开源·php·shell
旖旎夜光1 小时前
LCR 170:交易逆序对的总数(归并排序) —— 题解
c++·学习·算法·leetcode·排序算法
C++ 老炮儿的技术栈1 小时前
Linux 动态库踩坑:明明重新编译了 .so,调用函数返回值却一直不变(libfjrobot.so 版本号异常排查实录)
linux·c语言·网络·c++·visual studio
SEO_juper1 小时前
Go 站点地图生成器:从首页爬全站,一键生成 sitemap.xml
xml·开发语言·人工智能·golang·node.js·seo·外贸独立站
懂点Tech9 小时前
ctfshow misc28:GIF 高度修改解题与脚本实现
开发语言·windows·python
云和数据.ChenGuang9 小时前
Python 重写(Override)深度解析:从 MRO 到 super() 的完整机制
java·开发语言·人工智能·python·langchain·1024程序员节