C++中全局变量与静态局部变量初始化

时间:2022-11-06 19:36:30
我看了好几本书上说全局变量与静态局部变量的初始化必须要用常量或者常量表达式,但是我在VC++6.0上试验结果却不是这样,那么到底是C++有了新标准,还是VC++6.0编译器的问题。

20 个解决方案

#1


你把代码贴出来看看呗

#2


引用 1 楼 jmppok 的回复:
你把代码贴出来看看呗

我不会贴代码

比如
#include<iostream>
using namespace std;
int main()
{
         int a=0;
         static int b=a+1;
         cout<<b<<endl;
        return 0;
}

VC++ 6.0 通过编译 输出结果为1

#3


引用 1 楼 jmppok 的回复:
你把代码贴出来看看呗

#include<iostream>
using namespace std;

int get();

int main()
{

static int b=get();

cout<<b<<endl;

return 0;
}

int get()
{
return 1;
}

这个程序在VC++ 6.0也可以编译通过 输出结果为1

#4


引用 3 楼 u012672079 的回复:
Quote: 引用 1 楼 jmppok 的回复:

你把代码贴出来看看呗

#include<iostream>
using namespace std;

int get();

int main()
{

static int b=get();

cout<<b<<endl;

return 0;
}

int get()
{
return 1;
}

这个程序在VC++ 6.0也可以编译通过 输出结果为1


可能是书上说错了也不一定,我在网上也搜到了相同的论断。但是你发现其实那些书没说清楚是C还是C++,你在C里不能编译,那些情况是C的,C++是可以的。C++的初始化都是在运行时初始化的,编译的时候是先设成0,然后编译器会生成个默认的初始化代码放在main里面运行,静态局部变量就放在函数内生成默认初始化代码。而在C中之所以必须是常量是因为编译器不懂的C++那一套。

#5


vc6对标准支持的不够好  

#6


引用 5 楼 derekrose 的回复:
vc6对标准支持的不够好  

我电脑没有其他的编译器,我想问下,这种例子在VS2008或者VS2010上可以编译通过么

#7


引用 6 楼 u012672079 的回复:
Quote: 引用 5 楼 derekrose 的回复:

vc6对标准支持的不够好  

我电脑没有其他的编译器,我想问下,这种例子在VS2008或者VS2010上可以编译通过么

int f()
{
  return 1;
}

int main()
{
  static int x = f();
  return 0;
}

vs2013和g++都可以编译通过。
装一个vs2013 express吧,很容易的。vc6太古老了

#8


引用
全局变量与静态局部变量的初始化必须要用常量或者常量表达式

没有的事情。 

#9


这种函数内的静态变量, 属性懒汉类型.
也就是第一次调用到的时候才会分配内存并初始化.

#10


这几段代码没问题. 看来是这句话不太对.

引用 8 楼 mujiok2003 的回复:
引用
全局变量与静态局部变量的初始化必须要用常量或者常量表达式

没有的事情。 

#11


引用 10 楼 jmppok 的回复:
这几段代码没问题. 看来是这句话不太对.

Quote: 引用 8 楼 mujiok2003 的回复:

引用
全局变量与静态局部变量的初始化必须要用常量或者常量表达式

没有的事情。 

没有这样规定, OK? 所以那些代码才OK

#12


引用 11 楼 mujiok2003 的回复:
Quote: 引用 10 楼 jmppok 的回复:

这几段代码没问题. 看来是这句话不太对.

Quote: 引用 8 楼 mujiok2003 的回复:

引用
全局变量与静态局部变量的初始化必须要用常量或者常量表达式

没有的事情。 

没有这样规定, OK? 所以那些代码才OK

运行没有任何问题,说明这句话有点问题

#13


你确定不是说const?

#14


引用 12 楼 u010693250 的回复:
Quote: 引用 11 楼 mujiok2003 的回复:

Quote: 引用 10 楼 jmppok 的回复:

这几段代码没问题. 看来是这句话不太对.

Quote: 引用 8 楼 mujiok2003 的回复:

引用
全局变量与静态局部变量的初始化必须要用常量或者常量表达式

没有的事情。 

没有这样规定, OK? 所以那些代码才OK

运行没有任何问题,说明这句话有点问题

”你的这句话“ 是指l z的话啊,还以为说我呢

#15


我不知道别人的结果是怎样的,我只贴出自己测试的结果:
Windows XP SP2 + VS2008:
a. 以c方式编译:
StaticVar.c
int f(void)
{
return 1;
}

int main(void)
{
static int x = f();
return 0;
}

编译信息:
Error 1 error C2099: initializer is not a constant f:\study\vs2008\test\test\staticvar.c 8

以c++方式编译:
StaticVar.cpp
int f(void)
{
return 1;
}

int main(void)
{
static int x = f();
return 0;
}

编译没有出错信息.


VMware 9.0 + Ubuntu 14.04 LTS + gcc 4.8.2
StaticVar.c
int f(void)
{
return 1;
}

int main(void)
{
static int x = f();
return 0;
}

出错信息:
user@user-virtual-machine:~/Study$ cc -o StaticVar StaticVar.c
StaticVar.c: In function ‘main’:
StaticVar.c:8:2: error: initializer element is not constant
  static int x = f();
  ^
user@user-virtual-machine:~/Study$
 

g++没测试(现在用的这台电脑暂时没装)。

#16


修正一下,上面Windows的版本应该是 “Windows XP SP3 + VS2008”。

#17


不要迷信书、考题、老师、回帖;
要迷信CPU、编译器、调试器、运行结果。
并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。
任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实!

有人说一套做一套,你相信他说的还是相信他做的?
其实严格来说这个世界上古往今来所有人都是说一套做一套,不是吗?

不要写连自己也预测不了结果的代码!

#18


可以用linux的g++测试下

#19


编译器会自动优化

#20


在C语言中:无论如何编译器一定会从main()函数开始编译执行,
而c++中则不然。
全局变量,static修饰的局部变量在全局区。
全局区在main()函数运行之前就创建,程序结束前才销毁。
那么这个static修饰的局部变量就不能是一个不确定的值,
C99标准中全局变量和静态局部变量初始化时必须是一个常量或常量表达式
initializer element  must be constant !

#1


你把代码贴出来看看呗

#2


引用 1 楼 jmppok 的回复:
你把代码贴出来看看呗

我不会贴代码

比如
#include<iostream>
using namespace std;
int main()
{
         int a=0;
         static int b=a+1;
         cout<<b<<endl;
        return 0;
}

VC++ 6.0 通过编译 输出结果为1

#3


引用 1 楼 jmppok 的回复:
你把代码贴出来看看呗

#include<iostream>
using namespace std;

int get();

int main()
{

static int b=get();

cout<<b<<endl;

return 0;
}

int get()
{
return 1;
}

这个程序在VC++ 6.0也可以编译通过 输出结果为1

#4


引用 3 楼 u012672079 的回复:
Quote: 引用 1 楼 jmppok 的回复:

你把代码贴出来看看呗

#include<iostream>
using namespace std;

int get();

int main()
{

static int b=get();

cout<<b<<endl;

return 0;
}

int get()
{
return 1;
}

这个程序在VC++ 6.0也可以编译通过 输出结果为1


可能是书上说错了也不一定,我在网上也搜到了相同的论断。但是你发现其实那些书没说清楚是C还是C++,你在C里不能编译,那些情况是C的,C++是可以的。C++的初始化都是在运行时初始化的,编译的时候是先设成0,然后编译器会生成个默认的初始化代码放在main里面运行,静态局部变量就放在函数内生成默认初始化代码。而在C中之所以必须是常量是因为编译器不懂的C++那一套。

#5


vc6对标准支持的不够好  

#6


引用 5 楼 derekrose 的回复:
vc6对标准支持的不够好  

我电脑没有其他的编译器,我想问下,这种例子在VS2008或者VS2010上可以编译通过么

#7


引用 6 楼 u012672079 的回复:
Quote: 引用 5 楼 derekrose 的回复:

vc6对标准支持的不够好  

我电脑没有其他的编译器,我想问下,这种例子在VS2008或者VS2010上可以编译通过么

int f()
{
  return 1;
}

int main()
{
  static int x = f();
  return 0;
}

vs2013和g++都可以编译通过。
装一个vs2013 express吧,很容易的。vc6太古老了

#8


引用
全局变量与静态局部变量的初始化必须要用常量或者常量表达式

没有的事情。 

#9


这种函数内的静态变量, 属性懒汉类型.
也就是第一次调用到的时候才会分配内存并初始化.

#10


这几段代码没问题. 看来是这句话不太对.

引用 8 楼 mujiok2003 的回复:
引用
全局变量与静态局部变量的初始化必须要用常量或者常量表达式

没有的事情。 

#11


引用 10 楼 jmppok 的回复:
这几段代码没问题. 看来是这句话不太对.

Quote: 引用 8 楼 mujiok2003 的回复:

引用
全局变量与静态局部变量的初始化必须要用常量或者常量表达式

没有的事情。 

没有这样规定, OK? 所以那些代码才OK

#12


引用 11 楼 mujiok2003 的回复:
Quote: 引用 10 楼 jmppok 的回复:

这几段代码没问题. 看来是这句话不太对.

Quote: 引用 8 楼 mujiok2003 的回复:

引用
全局变量与静态局部变量的初始化必须要用常量或者常量表达式

没有的事情。 

没有这样规定, OK? 所以那些代码才OK

运行没有任何问题,说明这句话有点问题

#13


你确定不是说const?

#14


引用 12 楼 u010693250 的回复:
Quote: 引用 11 楼 mujiok2003 的回复:

Quote: 引用 10 楼 jmppok 的回复:

这几段代码没问题. 看来是这句话不太对.

Quote: 引用 8 楼 mujiok2003 的回复:

引用
全局变量与静态局部变量的初始化必须要用常量或者常量表达式

没有的事情。 

没有这样规定, OK? 所以那些代码才OK

运行没有任何问题,说明这句话有点问题

”你的这句话“ 是指l z的话啊,还以为说我呢

#15


我不知道别人的结果是怎样的,我只贴出自己测试的结果:
Windows XP SP2 + VS2008:
a. 以c方式编译:
StaticVar.c
int f(void)
{
return 1;
}

int main(void)
{
static int x = f();
return 0;
}

编译信息:
Error 1 error C2099: initializer is not a constant f:\study\vs2008\test\test\staticvar.c 8

以c++方式编译:
StaticVar.cpp
int f(void)
{
return 1;
}

int main(void)
{
static int x = f();
return 0;
}

编译没有出错信息.


VMware 9.0 + Ubuntu 14.04 LTS + gcc 4.8.2
StaticVar.c
int f(void)
{
return 1;
}

int main(void)
{
static int x = f();
return 0;
}

出错信息:
user@user-virtual-machine:~/Study$ cc -o StaticVar StaticVar.c
StaticVar.c: In function ‘main’:
StaticVar.c:8:2: error: initializer element is not constant
  static int x = f();
  ^
user@user-virtual-machine:~/Study$
 

g++没测试(现在用的这台电脑暂时没装)。

#16


修正一下,上面Windows的版本应该是 “Windows XP SP3 + VS2008”。

#17


不要迷信书、考题、老师、回帖;
要迷信CPU、编译器、调试器、运行结果。
并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。
任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实!

有人说一套做一套,你相信他说的还是相信他做的?
其实严格来说这个世界上古往今来所有人都是说一套做一套,不是吗?

不要写连自己也预测不了结果的代码!

#18


可以用linux的g++测试下

#19


编译器会自动优化

#20


在C语言中:无论如何编译器一定会从main()函数开始编译执行,
而c++中则不然。
全局变量,static修饰的局部变量在全局区。
全局区在main()函数运行之前就创建,程序结束前才销毁。
那么这个static修饰的局部变量就不能是一个不确定的值,
C99标准中全局变量和静态局部变量初始化时必须是一个常量或常量表达式
initializer element  must be constant !

#21