社区
C++ 语言
帖子详情
VC中 如何保证未被引用的全局变量被链接
flysnowxg
2011-08-09 09:52:12
如题
有时定义全局变量只是为了分散做一些初始化工作,但发现未被引用的全局变量有时没被链接
求解
...全文
258
23
打赏
收藏
VC中 如何保证未被引用的全局变量被链接
如题 有时定义全局变量只是为了分散做一些初始化工作,但发现未被引用的全局变量有时没被链接 求解
复制链接
扫一扫
分享
转发到动态
举报
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]
就是为了方便才全局的
主要为了不需要为了加个消息,还要跑到别处去改一下代码
珍惜生命远离CPP
2011-08-09
打赏
举报
回复
[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一下,求理解不引用的情况下分散初始化工作是个什么新型的概念
珍惜生命远离CPP
2011-08-09
打赏
举报
回复
[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)
VC
中
定义
全局变量
1
VC
中
如何定义
全局变量
答:
放在任意文件里
在其他文件里用 extern 声明
或者在App类
中
声明一个公有成员
在程序其它类
中
可以用
AfxGetApp() 得到一个App对象指针,将它转化成你的App类指针
然后就可以通过指针->变量使用了
还有就是在
MFC
中
定义只有静态成员的类 到时候直接应用就可以了,还不
破坏结构
多进程
引用
的动态
链接
库
中
的
全局变量
问题
多进程
引用
的动态
链接
库
中
的
全局变量
问题现有liba.so
中
定义一个
全局变量
char buf; libb.so
中
的函数print会将buf进行输出。 进程A和进程B使用-lb进行编译
链接
,并在进程A和B
中
分别对buf进行初始化,如strcpy(buf, "A"); strcpy(buf, "B"); 进程A和进程B在初始化后分别通过dlopen的方式加载liba.so并调用其
中
的print函数。 ...
VC
++
中
的
全局变量
VC
中
使用
全局变量
的2种办法及防错措施 1. 对于
全局变量
存在和函数一样的问题,为了在其他CPP文件
中
能够访问这些变量,必须在主文件的H文件
中
加上extern声明,格式如下: extern varibletype var; (声明)在主文件的CPP文件
中
定义 variblety
VC
中
如何定义
全局变量
问:
VC
中
如何定义
全局变量
答: 放在任意文件里 在其他文件里用 extern 声明 或者在App类
中
声明一个公有成员 在程序其它类
中
可以用 AfxGetApp() 得到一个App对象指针,将它转化成你的App类指针 然后就可以通过指针->变量使用了 还有就是在 MFC
中
定义只有静态成员的类 到时候直接应用就可以了,
转
vc
中
定义
全局变量
http://bbs.csdn.net/topics/380070183 http://zhidao.baidu.com/link?url=gWyCQDBOfFmRE3d8NR_DwYYBalit2j-fi35VnaFDCENTLydopo8rBYWfkkBmusiG0P1CUTLijbyZGiRa1_9pra 没有啥好的办法,在需要
全局变量
的cpp文件定义,别的地方,可以exter
C++ 语言
65,204
社区成员
250,523
社区内容
发帖
与我相关
我的任务
C++ 语言
C++ 语言相关问题讨论,技术干货分享,前沿动态等
复制链接
扫一扫
分享
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
请不要发布与C++技术无关的贴子
请不要发布与技术无关的招聘、广告的帖子
请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下
试试用AI创作助手写篇文章吧
+ 用AI写文章