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

flysnowxg 2011-08-09 09:52:12
如题
有时定义全局变量只是为了分散做一些初始化工作,但发现未被引用的全局变量有时没被链接
求解
...全文
258 23 打赏 收藏 转发到动态 举报
AI 作业
写回复
用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有时也会出一些更离谱的问题,比如代码重编了还说代码已经过期
不知道是编译器不严谨还是环境配的有问题


luciferisnotsatan 2011-08-09
  • 打赏
  • 举报
回复
[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没被执行
这只是个例子,实际情况是我要分散做消息注册

所以我觉得这样的代码不应当被优化掉,编译器不该做这个工作

至善者善之敌 2011-08-09
  • 打赏
  • 举报
回复
用volatile或extern试试
luciferisnotsatan 2011-08-09
  • 打赏
  • 举报
回复
有时定义全局变量只是为了分散做一些初始化工作

但又说没被引用,什么意思?到底是用到了还是没用到?没被用到的,你怎么知道没被连接呢?从一开始就不存在,编译器最多给个warning,不会报连接错误呀。

jackyjkchen 2011-08-09
  • 打赏
  • 举报
回复
不知道volatile关键字有没有这个效果

反正我知道用dllexport导出全局变量,肯定可以保证不被优化掉
jackyjkchen 2011-08-09
  • 打赏
  • 举报
回复
如果未被引用,当然编译器可以把它优化掉……
flysnowxg 2011-08-09
  • 打赏
  • 举报
回复
[Quote=引用 20 楼 forestdb 的回复:]
warning能否发现未被使用的变量??
[/Quote]
全局变量不报这个警告
因为全局变量一般是在其他编译单元被引用
如果没被引用,他再哪里报警告
加载更多回复(3)

65,204

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧