跳转到主内容
趣航编程网 - 趣学编程,启航技术之路!

c++如何定义全局变量_c++ extern关键字用法【避坑】

头文件中只能用extern声明全局变量,定义必须唯一出现在一个.cpp文件中;const全局变量默认内部链接,跨文件共享需显式extern声明;extern"C"用于指定C链接方式,与extern声明无关。 全局变量不能在头文件里直接定义,否则多文件包含时会链接失败;
extern
是声明而非定义,它本身不分配内存。 头文件里只能声明,不能定义全局变量 很多人在
common.h
里写
int g_count = 0;
,结果多个
.cpp
包含它后,链接时报
multiple definition of 'g_count'
。这是因为每个编译单元都生成了一份定义。 ✅ 正确做法:头文件中只用
extern int g_count;
声明 ✅ 定义必须且只能出现在一个
.cpp
文件里(如
global.cpp
),写成
int g_count = 0;
❌ 不要写
extern int g_count = 0;
—— 带初始化的
extern
在 C++ 中是定义,不是声明 extern 和 const 全局变量的特殊规则 C++ 中
const
全局变量默认具有内部链接(
internal linkage
),即使不加
static
,也不会被其他文件看到。 如果想跨文件共享
const int g_version = 1024;
,必须显式加
extern
声明:
extern const int g_version;
(头文件) +
const int g_version = 1024;
(一个
.cpp
) 否则其他文件即使
#include
头文件,也看不到这个常量,编译报
undefined reference
注意:C++17 起可用
inline constexpr
替代,更安全简洁 extern "C" 是另一回事,别和 extern 混用
extern
关键字单独出现时,只管链接属性;加上
"C"
字符串字面量后,就变成告诉 C++ 编译器“按 C 的方式命名和调用”,和全局变量定义无关。 C知道 CSDN推出的一款AI技术问答工具 下载 立即学习 “ C++免费学习笔记(深入) ”;
extern int g_flag;
→ 声明一个 C++ 链接的全局变量
extern "C" int g_flag;
→ 声明一个 C 链接的全局变量(通常用于混编或系统 API) 混用如
extern "C" { extern int g_x; }
合法但冗余,除非你真在对接 C 库的全局符号 最容易忽略的是:
extern
声明可以多次(跨头文件、多次
#include
都行),但定义只能一次;而一旦某个地方不小心给
extern
变量赋了初值,它就不再是声明,成了定义——这时重复包含就会爆炸。

相关文章