extern int声明后必须有且仅有一个定义,否则链接失败;const int默认内部链接,需extern显式声明为外部链接;extern "c"对变量链接无影响。

extern int 声明后不定义会链接失败
声明 extern int 只是告诉编译器“这个变量在别处定义”,但链接时必须有且仅有一个定义。常见错误是只在头文件里写 extern int foo;,又在多个 .cpp 文件里包含它——结果每个文件都看到声明,但谁都没提供定义,最终链接时报 undefined reference to 'foo'。
正确做法:选一个源文件(比如 globals.cpp)给出定义:int foo = 42;;其他地方只用 extern int foo; 声明。
- 头文件(
globals.h)里放:extern int foo; - 源文件(
globals.cpp)里放:int foo = 0;(注意:不能加extern) - 其他
.cpp文件包含globals.h即可访问foo
const int 默认内部链接,extern 要显式加
C++ 中 const int bar = 10; 在文件作用域下默认是 static 链接(即仅本文件可见),即使你写了 extern const int bar; 声明,也没法跨文件访问——因为定义本身没导出。
想让常量全局可见,定义时就得带 extern:
立即学习“C++免费学习笔记(深入)”;
extern const int bar = 10;
这样它才有外部链接,才能被其他文件的 extern const int bar; 正确绑定。
- 不加
extern的const int定义 → 仅本文件有效 - 加
extern的const int定义 → 全局可见,但只能定义一次 - 头文件中仍用
extern const int bar;声明(不带初始化)
extern "C" int 不解决 C++ 全局变量链接问题
extern "C" 是为函数名修饰(name mangling)服务的,和变量链接属性无关。写 extern "C" int baz; 声明变量,对链接行为毫无影响——它既不会让变量变成 C 风格链接,也不会绕过“一个定义规则”(ODR)。
真正需要 extern "C" 的场景,是 C++ 代码调用 C 库里的全局变量(比如 errno),此时 C 头文件通常已用 extern "C" 包裹,你只需照常包含头文件即可。
-
extern "C" int x;声明 → 合法但无实际意义(变量没有 name mangling) - 混用 C/C++ 时,变量链接靠定义位置和
extern配合,不是靠"C"块 - 误以为加了
extern "C"就能多处定义,反而导致 ODR 违反










