什么可以在c ++中初始化全局变量

时间:2011-05-01 03:33:52

标签: c++ syntax initialization global-variables

你能用c ++初始化全局变量,如果可能的话,允许使用什么值?

4 个答案:

答案 0 :(得分:5)

允许的值取决于变量的类型。对于int,0或42都可以。对于string,“你好世界”的作品。初始化全局变量与初始化其他变量完全相同,因此您可以自由使用所有变量。

通常最好保持简单;如果你需要一个全局的复杂初始化器,变量可能在错误的位置,但如果需要你可以做很多。

这样做的语法最基本的是:

int global_Int = 42;
string global_String = "Hello World";

但是,如果在头文件中完成(因为全局变量通常在公共头中声明),您将获得重复的声明和错误。要解决这个问题,请使用extern关键字声明它们,然后在代码文件中初始化:

标题

extern int global_Int;
extern string global_String;

代码:

#include "header.hpp"

int global_Int = 42;
string global_String = "Hello World";

然后只需在需要使用变量时包含标题。您还可以根据需要添加其他关键字(例如,如果您需要const全局)。

答案 1 :(得分:4)

是的,当然你可以初始化全局变量。对于内置类型,您可以使用可用于赋值的任何值(并且还可以初始化无法分配的数组)。对于类类型,由您决定在设计类时允许(和/或需要)哪些类型/值。对于预定义的类,您基本上必须查阅文档以确定它允许/需要的内容。

然而,最终,它是一个全球性的事实不会影响可以提供的价值。作为一个全局可以影响你如何获得价值 - 特别是,当你完成初始化时,你显然不能使用尚不可用的值。这可能比最初看起来更微妙一点,因为关于全局变量初始化的顺序相互之间的保证很少,所以(例如)当全局变量的构造函数执行时,std::cinstd::coutstd::cerr可能尚未构建,因此如果您想根据用户的输入初始化某些内容,您可能需要采取特殊步骤来确保初始化顺序或其他方式(对于示例)对该特定作业使用C样式的I / O.

答案 2 :(得分:3)

当然可以。为什么我们不能?

//global variables
int g_int = 100;
int g_float = 10.0;
int g_char = 'A';

class X 
{
   int value;
   public:
      X(int v) : value(v){}
};

X g_x1(10);  //initialize with argument 10
X g_x2 = X(198); //with arg 198

int main()
{
}

答案 3 :(得分:1)

几乎可以是构造函数调用中的任何内容:

static const std::string boo( "42" );

但请注意 - 它们在main()之前运行,但它们的顺序未定义(请参阅"static initialization order fiasco")。