添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
C++ 语言 帖子详情

VC中 如何保证未被引用的全局变量被链接

flysnowxg 2011-08-09 09:52:12
如题
有时定义全局变量只是为了分散做一些初始化工作,但发现未被引用的全局变量有时没被链接
...全文
254 23 打赏 收藏
用AI写文章
23 条 回复
切换为时间正序
请发表友善的回复…
发表回复
tompaz 2011-08-09
  • 打赏
  • 举报
回复
既然没被引用,那还要他干嘛?
flysnowxg 2011-08-09
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 jackyjkchen 的回复:]
不知道volatile关键字有没有这个效果
反正我知道用dllexport导出全局变量,肯定可以保证不被优化掉
[/Quote]
dll导出是一个便捷方法
如果有编译器开关就更好了
pathuang68 2011-08-09
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 luciferisnotsatan 的回复:]
引用 6 楼 akirya 的回复:
引用 5 楼 flysnowxg 的回复:
不报错也不报警告
我只需要用全局对象分散执行一些代码而已
一个cpp里面的
vector<int> g_needinital;
另一个cpp里面(很cpp有类似的定义,
extern vector<int> g_needinital;
class CAddData
[/Quote]
1. CAddData g_adddata最好不要整成全局的
2. 全局变量一般是要独立存在的,即一个全局变量不要依赖于另外一个全局变量,否则就很容易出现楼主碰到的问题。
flysnowxg 2011-08-09
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 akirya 的回复:]
引用 10 楼 flysnowxg 的回复:
我也觉得绝对不应当被优化掉
但实际情况下有时就是没执行
不过vs有时也会出一些更离谱的问题,比如代码重编了还说代码已经过期
不知道是编译器不严谨还是环境配的有问题
clean rebuild试试
[/Quote]
rebuild有时是好的
但是这样总是让人担心有时会不会掉了什么东西,不放心啊
flysnowxg 2011-08-09
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 jackyjkchen 的回复:]
试试volatile吧,另外CAddData g_adddata;
这个可以不用全局的
[/Quote]
帖子引错了
就是为了方便才全局的
主要为了不需要为了加个消息,还要跑到别处去改一下代码
flysnowxg 2011-08-09
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 flysnowxg 的回复:]
我也觉得绝对不应当被优化掉
但实际情况下有时就是没执行
不过vs有时也会出一些更离谱的问题,比如代码重编了还说代码已经过期
不知道是编译器不严谨还是环境配的有问题
[/Quote]
就是为了方便才全局的
主要为了不需要为了加个消息,还要跑到别处去改一下代码
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 flysnowxg 的回复:]
我也觉得绝对不应当被优化掉
但实际情况下有时就是没执行
不过vs有时也会出一些更离谱的问题,比如代码重编了还说代码已经过期
不知道是编译器不严谨还是环境配的有问题
[/Quote]
clean rebuild试试
flysnowxg 2011-08-09
  • 打赏
  • 举报
回复
初始化顺序好解决
g_needinital只要用函数返回就不会有初始化问题了
vector<int>&
getneedintialdata
static vector<int> g_needinital;
return g_needinital;
}
jackyjkchen 2011-08-09
  • 打赏
  • 举报
回复
试试volatile吧,另外CAddData g_adddata;
这个可以不用全局的
flysnowxg 2011-08-09
  • 打赏
  • 举报
回复
我也觉得绝对不应当被优化掉
但实际情况下有时就是没执行
不过vs有时也会出一些更离谱的问题,比如代码重编了还说代码已经过期
不知道是编译器不严谨还是环境配的有问题
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 akirya 的回复:]
引用 5 楼 flysnowxg 的回复:
不报错也不报警告
我只需要用全局对象分散执行一些代码而已
一个cpp里面的
vector<int> g_needinital;
另一个cpp里面(很cpp有类似的定义,
extern vector<int> g_needinital;
class CAddData
public:
CAddData(){g……
[/Quote]
有自己写的构造函数,这个不应该被优化掉。
但全局对象的构造顺序是不确定的,没法保证一定先g_needinital,然后g_adddata
jackyjkchen 2011-08-09
  • 打赏
  • 举报
回复
CAddData g_adddata;
仅仅定义了一个全局对象,没有任何引用,release半刻呢定会优化掉。
你的意思是说CAddData的构造函数从没有被调用过是吧,就是这样的。
pamtry 2011-08-09
  • 打赏
  • 举报
回复
mark一下,求理解不引用的情况下分散初始化工作是个什么新型的概念
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 flysnowxg 的回复:]
不报错也不报警告
我只需要用全局对象分散执行一些代码而已
一个cpp里面的
vector<int> g_needinital;
另一个cpp里面(很cpp有类似的定义,
extern vector<int> g_needinital;
class CAddData
public:
CAddData(){g_needinital.push_back(10)……
[/Quote]
这种代码肯定不会被优化掉。
flysnowxg 2011-08-09
  • 打赏
  • 举报
回复
不报错也不报警告
我只需要用全局对象分散执行一些代码而已
一个cpp里面的
vector<int> g_needinital;
另一个cpp里面(很cpp有类似的定义,
extern vector<int> g_needinital;
class CAddData
public:
CAddData(){g_needinital.push_back(10);}
CAddData g_adddata;
有时发现g_adddata没被执行
这只是个例子,实际情况是我要分散做消息注册
所以我觉得这样的代码不应当被优化掉,编译器不该做这个工作
  • 打赏
  • 举报
回复
用volatile或extern试试
  • 打赏
  • 举报
回复
有时 定义全局变量 只是为了分散 做一些初始化工作
但又说没被引用,什么意思?到底是用到了还是没用到?没被用到的,你怎么知道没被连接呢?从一开始就不存在,编译器最多给个warning,不会报连接错误呀。
jackyjkchen 2011-08-09
  • 打赏
  • 举报
回复
不知道volatile关键字有没有这个效果
反正我知道用dllexport导出全局变量,肯定可以保证不被优化掉
jackyjkchen 2011-08-09
  • 打赏
  • 举报
回复
如果未被引用,当然编译器可以把它优化掉……
flysnowxg 2011-08-09
  • 打赏
  • 举报
回复
[Quote=引用 20 楼 forestdb 的回复:]
warning能否发现未被使用的变量??
[/Quote]
全局变量不报这个警告
因为全局变量一般是在其他编译单元被引用
如果没被引用,他再哪里报警告
加载更多回复(3)
发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员