全局变量初始化
global variable initialization
原则上,在任何函数之外定义的变量(即全局、命名空间和类静态变量)在调用main()
之前进行初始化。翻译单元中的此类非局部变量按其声明顺序初始化
以上是我的讲师给出的课堂笔记中的几行。
#include <iostream>
using namespace std;
int a=99;
int main(int argc, char *argv[])
{
cout<<a<<endl;
cout<<b<<endl;
return 0;
}
int b=100;
运行此内容时出现错误。在召唤main()
之前,b
分配给100
不是真的吗?
这里的问题不在于初始化顺序:b
确实在main
开始运行之前就被初始化了。
问题是b
的"可见性"。在编译main
时,没有b
.
您可以通过将b
的定义/初始化移动到 main
之前来修复它:
#include <iostream>
using namespace std;
int a = 99;
int b = 100;
int main (int argc, char *argv[]) {
cout << a << 'n';
cout << b << 'n';
return 0;
}
或者简单地指出b
存在:
#include <iostream>
using namespace std;
int a = 99;
extern int b;
int main (int argc, char *argv[]) {
cout << a << 'n';
cout << b << 'n';
return 0;
}
int b = 100;
在运行时创建或初始化b
时,这两个解决方案都不会改变,它们只是在main
中提供b
。
你的讲师错了;全局变量是按照定义的顺序初始化的,而不是声明的。
例如
#include <iostream>
struct S { S(const char *s) { std::cout << s << 'n'; } };
extern S a; // declaration
extern S b; // declaration
int main() { }
S b("b"); // definition
S a("a"); // definition
将打印
b
a
您发布的代码不起作用,因为b
甚至没有在使用时声明。 声明(例如,extern int b
)是必需的,因为C++(如 C)最初设计为一次性编译器。
问题就在这里:cout<<b<<endl;
声明变量之前,无法访问变量。
仔细阅读。
在任何函数 (B) 外部定义的变量在调用 main 之前初始化(未编译)。
为了正确编译B,B应该在第一次使用之前定义(并声明)(这是你的错误:B在任何地方声明之前被使用)。
问题是语句b=100;
:你不能将语句放在全局范围内(变量初始化除外)。
如果此行保持原样,则无论b
声明/定义或在main
或任何地方使用b
,代码都不会编译。
如果没有这一行,代码是正确的并且可以工作,b
值等于 0
,因为未初始化的全局变量被初始化为 0(或者行b=100;
可以移动到任何函数范围内)。
相关文章:
- 未初始化的变量有什么危险
- 使用的未初始化局部变量'Quick'
- C++如何通过"constructor initialization"初始化行变量?
- "local scope"中的 C++ 初始化静态变量
- 使用 std::ios_base::Init 正确初始化全局变量
- 在 glsl 中初始化全局变量?
- 未显式初始化C++全局变量时发出警告?
- 定义,初始化全局const变量是安全的吗?
- 如何懒惰地初始化全局变量?
- 初始化全局变量时,Clang-4.0会生成冗余方法
- 何时初始化静态变量和全局变量
- 条件运算符是在全局作用域中初始化全局变量的唯一方法
- 交叉初始化全局(外部)变量
- 强制在某个静态字段之前初始化全局变量
- 使用C与C++中的函数调用初始化全局变量
- 如果需要从配置文件初始化全局变量,如何在项目中共享全局变量
- 在初始化全局变量时使用断言宏
- c++中如何初始化全局变量?
- 用于初始化全局变量的函数究竟何时执行
- 在c++中重载全局new()调用之前未初始化全局静态变量