Sil*_*iu 10 c++ static initialization
我刚刚发现了这个,我称之为编译异常,但有人可能会对此有一个很好的解释.
因此,对于静态存储数据,可以用自己初始化变量......我已经尝试使用VS2015和VS2017编译器以及其他一些在线c ++编译器.
Kei*_*son 17
它实际上static和非static变量相同.
名称在其声明符之后和初始化之前立即可见(如果有).因此在
static int x = x;
Run Code Online (Sandbox Code Playgroud)
名称x在第一次出现后立即可见,并可在初始化程序中引用.因为它是静态的,所以它的初始值很明确(它是0).
即使在块范围内,这也是合法的:
int x = x;
Run Code Online (Sandbox Code Playgroud)
虽然在这里你可能会收到一个警告,因为x它正在使用自己的不确定值进行初始化(在大多数情况下,行为是未定义的).
这是一个愚蠢的事情,但C++并不是为了阻止你做愚蠢的事情.例如,您可能希望声明指向自身的指针:
void *p = (void*)&p;
Run Code Online (Sandbox Code Playgroud)
这里初始化程序引用的是地址p而不是它的值,但是名称p必须是可见的才能使其起作用.添加特殊情况规则被认为是不值得的.