网页资讯视频图片知道文库贴吧地图采购
进入贴吧全吧搜索

 
 
 
日一二三四五六
       
       
       
       
       
       

签到排名:今日本吧第个签到,

本吧因你更精彩,明天继续来努力!

本吧签到人数:0

一键签到
成为超级会员,使用一键签到
一键签到
本月漏签0次!
0
成为超级会员,赠送8张补签卡
如何使用?
点击日历上漏签日期,即可进行补签。
连续签到:天  累计签到:天
0
超级会员单次开通12个月以上,赠送连续签到卡3张
使用连续签到卡
02月05日漏签0天
c++吧 关注:651,930贴子:2,117,931
  • 看贴

  • 图片

  • 吧主推荐

  • 游戏

  • 20回复贴,共1页
<<返回c++吧
>0< 加载中...

请教!如何保证某些全局变量优先创建(在不同的编译单元中)?

  • 只看楼主
  • 收藏

  • 回复
  • 崇拜八神
  • ,
    1
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
如题。比如我有1.cpp 2.cpp 3.cpp;每个CPP中有一个全局变量:val1,val2,val3;有没有什么方法可以使得val1最先被初始化,val2次之,val3最后? 百度半天没有发现类似的问题和解决方式,难道是这个问题太白痴?-_-!


  • 蓖蚕
  • &&
    6
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
多层变量后,包含文件,devcpp可实现,别的估计不能


2026-02-05 10:57:30
广告
不感兴趣
开通SVIP免广告
  • elematrix
  • &
    9
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
没有


  • 崇拜八神
  • ,
    1
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
。。。或者换个简单一点的方式:能不能确定或者自己设置CPP的编译顺序?测试发现好像是按编译顺序初始化的全局对象?如果结论正确的话,是否能通过先编译1.CPP 再编译2.CPP等等 来解决这个问题?


  • 灰色8酷
  • |
    7
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
改设计吧


  • 幻の上帝
  • ->*
    15
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
没有标准做法。如果你只是多个源文件,那么以确定顺序包含可行,但这样就只是一个翻译单元。
GCC用__attribute__((init_priority(X))。


  • 毒爱流星
  • &
    9
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
这个结构不好,一些古怪蹩脚的思路,其实换一个方法就会很简单


  • hzqst
  • ==
    10
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
直接弄个Init代替构造函数多好


2026-02-05 10:51:30
广告
不感兴趣
开通SVIP免广告
  • 崇拜八神
  • ,
    1
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
还想追问一下:
由于我自己实现的staticContainerType * GetInstance()函数是普通的判断实现:if( l_instance == 0) { l_instance = new ContainerType; }return l_instance ;对于static ContainerType * l_instance ;该静态成员需要初始化,当我在外面把其初始化为0的时候,程序一切正常;当我随便初始化一个地址,比如0X1231时,报错;调试发现在第一次调用GetInstance()时该成员的值被赋值成了0X1231,就是说该成员的初始化变成了在其他全局变量的最前面(我在该初始化语句的上面也定义了全局变量的)。但是我把初始化语句改成:ContainerType * GlobalContainer::l_instance =new ContainerType;之后,问题来了,调试发现该初始化又不是最先调用的了,也就是说在程序运行中获取该容器对象时,里面理论上应该保存的类对象数据都没了!该容器变成了一个空容器!
1 ContainerType * GlobalContainer::l_instance =0;//一切正常 初始化动作并没有把该成员变回0
2.ContainerType * GlobalContainer::l_instance =0x1231;//崩溃 因为在GetInstance中该变量不满足条件语句,导致直接操作了非法地址;
3.ContainerType * GlobalContainer::l_instance =new ContainerType;//出现问题,运行中发现该变量中不再存在元素。。
(1,2点应该证明了容器指针的初始化动作跳到了所有注册对象构造的前面,而3点却又说明初始化动作又比其他对象晚了!)
凌乱了。。。。这个到底是神马情况??


  • 幻の上帝
  • ->*
    15
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
真要严格确定静态存储的对象的顺序的地方就不要用命名空间作用域对象,使用返回函数内局部static的对象,通过调用依赖来隐式确定必要的初始化顺序。如果觉得析构顺序不容易控制就用对应的unique_ptr代替。


  • louisejackie
  • &&
    6
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
留名回看。


  • 仇一败
  • ,
    1
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
标记一下,以后回看


登录百度账号

扫二维码下载贴吧客户端

下载贴吧APP
看高清直播、视频!
  • 贴吧页面意见反馈
  • 违规贴吧举报反馈通道
  • 贴吧违规信息处理公示
  • 20回复贴,共1页
<<返回c++吧
分享到:
©2026 Baidu贴吧协议|隐私政策|吧主制度|意见反馈|网络谣言警示