+ -
当前位置:首页 → 问答吧 → 如何保证一个全局对象第一个构造

如何保证一个全局对象第一个构造

时间:2011-12-10

来源:互联网

定义了一个全局对象,如何保证他是第一个构造呢?

放在theApp上面可以保证构造早于theApp,但是如果有很多文件呢,怎么保证要比其他文件中的全局变量构造早呢

有人说和编译顺序有关,后编译的文件先构造,但是在实验中发现又不是这个样子,
请问,多个文件中的全局对象,构造顺序是如何的?

作者: gao_zilai   发布时间: 2011-12-10

全局对象就够早了,为什么要特别比其他早.可以所有全局对象都构建了,然后在InitInstance中坐各个对象初始化工作,这样就可以控制顺序了

作者: oyljerry   发布时间: 2011-12-10

typedef struct _tagMyStruct
{
} MyStruct;

#define SECNAME ".CRT$XCB"
#pragma section(SECNAME, long, read)

__declspec(allocate(SECNAME)) MyStruct myStruct;

作者: Saleayas   发布时间: 2011-12-10

但是如果其他的文件里也是这样,那么不能保证了。
这只能保证相对于缺省编译器的全局数据。
如果你需要自定义的数据也后先后关系,那么在 SECNAME 上面做文档。
会按照 SECNAME 的顺序构造。
缺省的编译器可能在
#pragma section(".CRT$XCC",long,read)
#pragma section(".CRT$XCU",long,read)
构造,具体好像是 VC 编译器有修改。
但是 在 CC之前肯定可以在缺省数据之前构造。

作者: Saleayas   发布时间: 2011-12-10

引用 1 楼 oyljerry 的回复:

全局对象就够早了,为什么要特别比其他早.可以所有全局对象都构建了,然后在InitInstance中坐各个对象初始化工作,这样就可以控制顺序了

多谢 oyljerry 能回复,有特殊的应用场合,并且不算不合理。

比如有一个可以进程通信的日志记录类,他用来记录一个程序的所有启动日志(用于调试),包括记录程序实例创建之前其他的一切全局对象的初始化过程。这个时候是不是就要求它要第一个启动啊。
当然,发现了这个问题,就可以绕过去,现在只是探讨一下如何实现。

作者: gao_zilai   发布时间: 2011-12-10

引用 3 楼 saleayas 的回复:

但是如果其他的文件里也是这样,那么不能保证了。
这只能保证相对于缺省编译器的全局数据。
如果你需要自定义的数据也后先后关系,那么在 SECNAME 上面做文档。
会按照 SECNAME 的顺序构造。
缺省的编译器可能在
#pragma section(".CRT$XCC",long,read)
#pragma section(".CRT$XCU",long,read)
构造,具体好……

多谢,括号里面什么意思?求详解?

作者: gao_zilai   发布时间: 2011-12-10

引用 4 楼 gao_zilai 的回复:

引用 1 楼 oyljerry 的回复:

全局对象就够早了,为什么要特别比其他早.可以所有全局对象都构建了,然后在InitInstance中坐各个对象初始化工作,这样就可以控制顺序了

多谢 oyljerry 能回复,有特殊的应用场合,并且不算不合理。

比如有一个可以进程通信的日志记录类,他用来记录一个程序的所有启动日志(用于调试),包括记录程序实例创建之前其他的一切全局对象的初……

C/C++ code
改变下实现方式,日志记录类的记录接口改为静态即可,这样就没有所谓”第一个“的矛盾了
如果非要第一个构造,在需要记录启动日志的变量(类)都继承下 日志记录类 即可。

作者: gameslq   发布时间: 2011-12-10

对于不同文件中的全局对象、变量,它们的构造函数调用顺序是未定义的,取决于具体的编译器。
最好不要写出和编译顺序相关的程序来。

强烈建议楼主绕开这个问题,寻找代替方案。举例如下:
int a=5; 
int b=a; 
如果a和b定义在同一个文件里,那没什么问题,结果b等于5. 
如果a和b定义在不同文件里,当遇到b=a时不能保证a先初始化,解决这种问题的方法是不直接使用全局变量,而改用一个包装函数来访问。

C/C++ code
nt   get_a() 
{ 
          static   int   a   =   5; 
          return   a; 
} 
int   get_b() 
{ 
          static   int   b   =   get_a(); 
          return   b; 
} 
   


这样的话,无论get_a和get_b是否定义在同一个文件中,get_b总是 能够返回正确的结果,原因在于,函数内部的静态变量是在第一次访问的时候来初始化。

作者: fight_in_dl   发布时间: 2011-12-10

引用 7 楼 fight_in_dl 的回复:

对于不同文件中的全局对象、变量,它们的构造函数调用顺序是未定义的,取决于具体的编译器。
最好不要写出和编译顺序相关的程序来。

强烈建议楼主绕开这个问题,寻找代替方案。举例如下:
int a=5;
int b=a;
如果a和b定义在同一个文件里,那没什么问题,结果b等于5.
如果a和b定义在不同文件里,当遇到b=a时不能保证a先初始化,解决这种问题的方法是不直接使用全……
学习了。。。。

作者: coolcoffee4051982   发布时间: 2011-12-10

热门下载

更多