如何保证一个全局对象第一个构造
时间:2011-12-10
来源:互联网
放在theApp上面可以保证构造早于theApp,但是如果有很多文件呢,怎么保证要比其他文件中的全局变量构造早呢
有人说和编译顺序有关,后编译的文件先构造,但是在实验中发现又不是这个样子,
请问,多个文件中的全局对象,构造顺序是如何的?
作者: gao_zilai 发布时间: 2011-12-10
作者: oyljerry 发布时间: 2011-12-10
{
} 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
全局对象就够早了,为什么要特别比其他早.可以所有全局对象都构建了,然后在InitInstance中坐各个对象初始化工作,这样就可以控制顺序了
多谢 oyljerry 能回复,有特殊的应用场合,并且不算不合理。
比如有一个可以进程通信的日志记录类,他用来记录一个程序的所有启动日志(用于调试),包括记录程序实例创建之前其他的一切全局对象的初始化过程。这个时候是不是就要求它要第一个启动啊。
当然,发现了这个问题,就可以绕过去,现在只是探讨一下如何实现。
作者: gao_zilai 发布时间: 2011-12-10
但是如果其他的文件里也是这样,那么不能保证了。
这只能保证相对于缺省编译器的全局数据。
如果你需要自定义的数据也后先后关系,那么在 SECNAME 上面做文档。
会按照 SECNAME 的顺序构造。
缺省的编译器可能在
#pragma section(".CRT$XCC",long,read)
#pragma section(".CRT$XCU",long,read)
构造,具体好……
多谢,括号里面什么意思?求详解?
作者: gao_zilai 发布时间: 2011-12-10
引用 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
对于不同文件中的全局对象、变量,它们的构造函数调用顺序是未定义的,取决于具体的编译器。
最好不要写出和编译顺序相关的程序来。
强烈建议楼主绕开这个问题,寻找代替方案。举例如下:
int a=5;
int b=a;
如果a和b定义在同一个文件里,那没什么问题,结果b等于5.
如果a和b定义在不同文件里,当遇到b=a时不能保证a先初始化,解决这种问题的方法是不直接使用全……
作者: coolcoffee4051982 发布时间: 2011-12-10
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28