编译问题——关于全局变量的初始化顺序?

时间:2021-02-09 19:30:21
在多个模块中都有全局变量的定义;
我怎么才能保证全局变量按我希望的顺序初始化哪?

9 个解决方案

#1


哇~!这个东西我认为没有必要哈!只是看你在什么地方引用而已,只要不胡乱引用,只在你想引用的地方引用就行了哈!


我也是新手,希望高手指点哈!不知道我的观点对不对哈!

#2


如果一个全局变量调用了另一个全局变量,
那就很有必要了!

#3


被调用的在前,调用的在后呀!
呵呵!继续深入点,否则你得到的只是专业化的结果,而不包括非专业化的结果了。

#4


全局变量的初始化顺序是无法控制的,不同的编译器、连接器,结果都可能不同,另外,连接时,指定 .obj 文件的顺序也有关系

“如果一个全局变量调用了另一个全局变量”,只有变量为对象时才有这种情形吧。如果一个全局对象使用了另一个全局对象,并且依赖于后者的内容,那就很危险了,很可能导致错误(引用未初始化的对象)

另外,全局对象的初始化需要调用构造函数,存在“初始化顺序”的问题
普通变量的初始化根本不需要执行任何操作(程序加载进内存后就已经初始化了),根本无所谓顺序的问题,或者说:是同时初始化的

#5


虽然不是真正意义上的同时,但等于是同时哈!我是这样认为的。我反正不够专业,所以不知道专业的回答是什么样的哈!如果有人能够给一个非常专业的解释的话,我也很期待哈~!

#6


个人认为全局变量尽量少用。。。除非确实需要。
因为除了会弄乱全局的名字空间,也会使的名字冲突的可能性增加,还会增加使用这些变量的转换单元之间的依赖关系。使代码变很难维护(当然,这里指的比较大的工程)。变量在其他地方声明也使得代码难以理解。
呵呵,你可能会问我C++Builder自己都在使用全局变量拉(全局的窗体指针),这给所有用BCB的人觉得使用全局变量是没有问题。不过,个人认为BCB使用全局变量是有原因的(关于窗体的模式问题)。如果真需要使用全局变量,建议用写一个全局的类代替吧。将全局变量作为类的私有的静态变量,并使用静态的获取函数和设置函数来访问他。一般这可以防止破坏全局的名字空间,同时在某种程度上控制访问全局变量的方法。。。

呵呵。。。写了很多添。。。

#7


to 楼主:
   呵呵,上面写得有点离题了。。。不好意思。。。。一时忘记了,请楼主见谅。。

#8


如果你写过至少5年的程序,我猜你应该会这么做:

1、用一个或几个 struct 来管理各全局变量。
2、把这一个或几个 struct 都放在同一个单元文件(.cpp/.h)里。

如:

.h file:
struct  SGlobalVar
{
   SPath  path;
   int    ....;
   ....

  SGlobalVar();
}

extern SGlobalVar gv;

.cpp file:

SGlobalVar gv;


好处:
1、可以解决你说次序问题。
2、方便统一管理全局变量(全局变量只能管理,在一个稍大点的工程,个人认为不全局变量只是一种理想?)。

另:CB也会为我们提供一些全局变量。有时我们的全局变量生成次序和CB 的这些全局变量的必须确定(一般要求是我们的全局变量在后头生成),此时,可以将 :
extern SGlobalVar gv; 改成:
extern SGlobalVar *gv.
然后在合适的时候 new,delete...

#9


说了这么多,其实我就是想知道是否有办法能控制不同模块的全局变量初始化顺序,其实我也不想用全局变量,可是有的时候真的无法避免,CB里面就有好多,有些Form的全局变量在属性里面设一下就可以控制顺序,但是自定义的就不行了。
   其实就类而言,其内部也相当于有好多全局变量,只不过只有类内的函数才有访问权而已,要是类很庞大,同样也有全局变量的弊端。
TO:nanyu(南郁) 
   我用名字空间组织全局变量,算有经验的吗?^_^

#1


哇~!这个东西我认为没有必要哈!只是看你在什么地方引用而已,只要不胡乱引用,只在你想引用的地方引用就行了哈!


我也是新手,希望高手指点哈!不知道我的观点对不对哈!

#2


如果一个全局变量调用了另一个全局变量,
那就很有必要了!

#3


被调用的在前,调用的在后呀!
呵呵!继续深入点,否则你得到的只是专业化的结果,而不包括非专业化的结果了。

#4


全局变量的初始化顺序是无法控制的,不同的编译器、连接器,结果都可能不同,另外,连接时,指定 .obj 文件的顺序也有关系

“如果一个全局变量调用了另一个全局变量”,只有变量为对象时才有这种情形吧。如果一个全局对象使用了另一个全局对象,并且依赖于后者的内容,那就很危险了,很可能导致错误(引用未初始化的对象)

另外,全局对象的初始化需要调用构造函数,存在“初始化顺序”的问题
普通变量的初始化根本不需要执行任何操作(程序加载进内存后就已经初始化了),根本无所谓顺序的问题,或者说:是同时初始化的

#5


虽然不是真正意义上的同时,但等于是同时哈!我是这样认为的。我反正不够专业,所以不知道专业的回答是什么样的哈!如果有人能够给一个非常专业的解释的话,我也很期待哈~!

#6


个人认为全局变量尽量少用。。。除非确实需要。
因为除了会弄乱全局的名字空间,也会使的名字冲突的可能性增加,还会增加使用这些变量的转换单元之间的依赖关系。使代码变很难维护(当然,这里指的比较大的工程)。变量在其他地方声明也使得代码难以理解。
呵呵,你可能会问我C++Builder自己都在使用全局变量拉(全局的窗体指针),这给所有用BCB的人觉得使用全局变量是没有问题。不过,个人认为BCB使用全局变量是有原因的(关于窗体的模式问题)。如果真需要使用全局变量,建议用写一个全局的类代替吧。将全局变量作为类的私有的静态变量,并使用静态的获取函数和设置函数来访问他。一般这可以防止破坏全局的名字空间,同时在某种程度上控制访问全局变量的方法。。。

呵呵。。。写了很多添。。。

#7


to 楼主:
   呵呵,上面写得有点离题了。。。不好意思。。。。一时忘记了,请楼主见谅。。

#8


如果你写过至少5年的程序,我猜你应该会这么做:

1、用一个或几个 struct 来管理各全局变量。
2、把这一个或几个 struct 都放在同一个单元文件(.cpp/.h)里。

如:

.h file:
struct  SGlobalVar
{
   SPath  path;
   int    ....;
   ....

  SGlobalVar();
}

extern SGlobalVar gv;

.cpp file:

SGlobalVar gv;


好处:
1、可以解决你说次序问题。
2、方便统一管理全局变量(全局变量只能管理,在一个稍大点的工程,个人认为不全局变量只是一种理想?)。

另:CB也会为我们提供一些全局变量。有时我们的全局变量生成次序和CB 的这些全局变量的必须确定(一般要求是我们的全局变量在后头生成),此时,可以将 :
extern SGlobalVar gv; 改成:
extern SGlobalVar *gv.
然后在合适的时候 new,delete...

#9


说了这么多,其实我就是想知道是否有办法能控制不同模块的全局变量初始化顺序,其实我也不想用全局变量,可是有的时候真的无法避免,CB里面就有好多,有些Form的全局变量在属性里面设一下就可以控制顺序,但是自定义的就不行了。
   其实就类而言,其内部也相当于有好多全局变量,只不过只有类内的函数才有访问权而已,要是类很庞大,同样也有全局变量的弊端。
TO:nanyu(南郁) 
   我用名字空间组织全局变量,算有经验的吗?^_^