全局变量初始化

global variable initialization

本文关键字:初始化 全局变量      更新时间:2023-10-16

原则上,在任何函数之外定义的变量(即全局、命名空间和类静态变量)在调用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;可以移动到任何函数范围内)。