静态变量的初始化问题

时间:2021-07-17 19:39:53
template<int _T>
struct Test
{
  static int foo()
  {
     static int i = 0;
     return i++;
  }
};
上面的一个模板类是一个实际类的简化版本,使用Test的不同具现时,如_T为0,1等,有时i的值不能被初始化,即代码第一次进入foo的时候,i的值没有被初始化为0,而是一个非常大的负数。单独把这个类拿出来测试了下,在vc2005中,没有问题,放在一个项目中用的时候就出现了上述问题,有谁碰到过,可能的原因是什么。

10 个解决方案

#1


静态变量在进主函数之前就要被初始化的
static   int   i   =   0; 
这个的生存周期在 foo()这个函数内 如果单独调用上述简单的结构体 时可能初始化静态变量时会成功,
但是在一个项目中 有多个静态变量初始化会按照顺序执行 初始化可能不会在使用前就初始化.
还有一种可能是由于模板类型 是不确定 所以初始化静态变量比较晚 会出现没初始化就使用静态变量
这只是本人的说想到的. 在实际还没有具体遇到

#2



写的挺好的,应该不会遇到静态变量初始化顺序问题。

问题应该出现在其它地方。或者编译器不完全支持标准。vc2005应该不会有这个问题的,它高度符合标准。

#3


static函数不要放在类内实现。老的编译器会有一个不能正确实现"inline函数不inline时去重复"bug。

#4


单独看你这块代码没问题

#5


 代码没有问题,

#6


effective C++

#7


最好按照标准的写法来.不要在类里实现

#8


应该先要定义一下吧

#9


不过又好像没问题

#10


多线程?

#1


静态变量在进主函数之前就要被初始化的
static   int   i   =   0; 
这个的生存周期在 foo()这个函数内 如果单独调用上述简单的结构体 时可能初始化静态变量时会成功,
但是在一个项目中 有多个静态变量初始化会按照顺序执行 初始化可能不会在使用前就初始化.
还有一种可能是由于模板类型 是不确定 所以初始化静态变量比较晚 会出现没初始化就使用静态变量
这只是本人的说想到的. 在实际还没有具体遇到

#2



写的挺好的,应该不会遇到静态变量初始化顺序问题。

问题应该出现在其它地方。或者编译器不完全支持标准。vc2005应该不会有这个问题的,它高度符合标准。

#3


static函数不要放在类内实现。老的编译器会有一个不能正确实现"inline函数不inline时去重复"bug。

#4


单独看你这块代码没问题

#5


 代码没有问题,

#6


effective C++

#7


最好按照标准的写法来.不要在类里实现

#8


应该先要定义一下吧

#9


不过又好像没问题

#10


多线程?