1

原则上,定义在任何函数之外的变量(即全局变量、命名空间变量和类静态变量)会在调用 main() 之前初始化。翻译单元中的此类非局部变量按其声明顺序初始化

以上是我的讲师课堂笔记中的台词。

#include <iostream>

using namespace std;
int a=99;
int b;
int main(int argc, char *argv[]) 
{
  cout<<a<<endl;
  cout<<b<<endl;
  return 0;
}
b=100;

运行此程序时出现错误。在调用 main() 之前将 'b' 分配给 100 不是真的吗?错误是C++ requires a type specifier for all declarations

4

5 回答 5

5

这里的问题不是初始化顺序:b确实是在main开始运行之前初始化的。

问题在于b. 在main编译时没有b.

您可以通过将定义/初始化移动b到 before来修复它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在运行时创建或初始化时都不会改变,它们只是bmain.

于 2012-08-07T08:56:18.980 回答
3

你的讲师错了;全局变量按定义的顺序初始化,而不是声明

例如,

#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 类似)最初设计为一次性编译器

于 2012-08-07T08:56:40.047 回答
2

仔细阅读。

在调用 main (未编译)之前初始化在任何函数 (B) 之外定义的变量。

要正确编译 B 应该在第一次使用之前定义(和声明)(这是你的错误:在任何地方声明之前使用 B )。

于 2012-08-07T08:52:49.583 回答
2

问题在这里:cout<<b<<endl;

在声明之前,您无法访问该变量。

于 2012-08-07T08:50:45.217 回答
0

问题在于语句b=100;:您不能将语句放在全局范围内(变量初始化除外)。

b如果此行保持原样,则无论声明/定义或使用binside或任何地方,代码都不会编译main

如果没有这一行,代码是正确的并且可以使用bvalue equals 0,因为未初始化的全局变量被初始化为 0 (或者该行b=100;可以移动到任何函数范围内)。

于 2021-07-13T11:47:29.210 回答