2

我已经阅读了一些有关在声明时将值赋给全局变量的冲突信息。在声明中初始化全局变量值

有些人似乎允许这样的:

int g_int = 5; 

有的则说,必须在主被initalized:

int g_int; 
int main() { 
    g_int = 5; 
} 

我个人使用在Visual Studio 2008 - 2013年的第一个样式没有任何问题。

  • 这是合法的C++吗?
  • 如果它没有在C++中定义,它仍然是MSVC和g ++中的编译器定义的行为?
  • 如果它是合法的,函数结果的赋值也是合法的,函数调用保证在main之前执行?例如。 time_t g_starttime = time();
+0

'g_int = 5; '不是主要初始化。这是任务。 – NathanOliver

回答

1

有人说这必须在主

“其他”被初始化是错误的:虽然变量转换单元肯定可以main分配中定义的,他们不被分配在main

这在C++中是完全合法的。赋值的函数结果也是合法的,初始化保证在输入main之前发生。此外,如果您在同一个翻译单元内(即在同一个CPP文件中)有多个带有初始化的声明,它们将保证以文本顺序执行。如果你这样做

int twoTimes(int i) { 
    cout << "Doubling " << i << endl; 
    return 2*i; 
} 
int a = twoTimes(7); 
int b = twoTimes(8); 
int main() { 
    ... 
} 

输出保证是

Doubling 7 
Doubling 8 
1

首先,int g_int = 5;(和int g_int;)是不是声明,它的定义。

这是合法的C++吗?

是的,g_int将被初始化为值5。 (顺便说一句:对于int g_int;g_int将与价值0初始化)

如果是合法的,是一个函数结果的分配也是合法的,与函数调用之前保证主被执行?例如。 time_t g_starttime = time();?

是的,它是有保证的。

顺便说一句:g_int = 5;main()不是初始化,它只是分配。这意味着如果在main()输入之前使用g_int,则将使用默认值0(而不是5)。