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