C++难道没有规定,全局变量的初始化顺序?没有自动调整的机制?编译器有BUG?

会录 2014-01-21 10:25:23
例子:
********************file1.cpp

int a1 = 1191;

extern int b2;
int b3 = b2 + 1;


********************file2.cpp

extern int a1;
int a2 = a1 + 1;

extern int b1;
int b2 = b1 + 1;


********************file3.cpp

extern int a2;
int a3 = a2 + 1;

int b1 = 2212;



********************main.cpp

extern int a3;
extern int b3;
int main()
{
std::cout<<a3<<std::endl;
std::cout<<b3<<std::endl;
}






猜猜上面的a3和b3的输出结果,是否正确?结果是有问题的。




...全文
558 43 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
43 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
晕啊,你仔细想想,如果有顺序的话,这么多的文件,应当按照一个什么样的顺序呢????
  • 打赏
  • 举报
回复
c++定义变量一定要赋初值,不然在运行时时随机赋值的。
mujiok2003 2014-01-21
  • 打赏
  • 举报
回复
把所有全局变量都改成函数吧.

//int g = 3;
//declaration
int* g();
//implementation
int* g()
{
  static int g = 3;
  return &g;
}
乃不知有汉 2014-01-21
  • 打赏
  • 举报
回复
引用 22 楼 u013486147 的回复:
你谈到了多线程问题,我刚好就是为了解决多线程的一些问题,而需要初始化一些全局变量。 [quote=引用 20 楼 wangjunsheng 的回复:] 可以用函数的静态变量来 处理初始化顺序 int get_a() { static int a = 3; return a; } 但是在多线程下得小心 get_a() 在2个线程下同时调用 若 a 的类型是个结构体 可能会出现 a 没完全初始化 就被另一个线程返回了 不过只初始化一次是有保证的
[/quote] 多线程的话 在别的线程启动前 由主线程 主动调用初始化 如 void init() { int n = get_a(); // init get_a() 中的 static int a; ... } 函数的静态变量可以解决变量初始化顺序的问题 试试吧
YTerrenceLau 2014-01-21
  • 打赏
  • 举报
回复
对于C语言和C++语言来说,没有任何办法能解决楼主关于全局变量初始化依赖的问题。 是没有任何办法,而不是假设什么就能解决。
会录 2014-01-21
  • 打赏
  • 举报
回复
我的题目正好就是问这个问题啊。
引用 23 楼 ganpengjin1 的回复:
就是初始化顺序的顺序问题。 我想解决的,正是: 假如全局变量A的初始化,依赖于全局变量B的初始值。 我有什么方法,可以确保全局变量B,必先会被初始化? 既然是全局,那么你的定义就放一起定义,要用到的地方extern 就好了。 能不用全部变量尽量不要用。
引用 19 楼 ganpengjin1 的回复:
给你说下吧: int a1 = 1191; extern int b2; int b3 = b2 + 1; 好比这个,你确定是b2完之后再出初始化b3么,没人能够保证。
漫步者、 2014-01-21
  • 打赏
  • 举报
回复
就是初始化顺序的顺序问题。 我想解决的,正是: 假如全局变量A的初始化,依赖于全局变量B的初始值。 我有什么方法,可以确保全局变量B,必先会被初始化? 既然是全局,那么你的定义就放一起定义,要用到的地方extern 就好了。 能不用全部变量尽量不要用。
会录 2014-01-21
  • 打赏
  • 举报
回复
你谈到了多线程问题,我刚好就是为了解决多线程的一些问题,而需要初始化一些全局变量。
引用 20 楼 wangjunsheng 的回复:
可以用函数的静态变量来 处理初始化顺序 int get_a() { static int a = 3; return a; } 但是在多线程下得小心 get_a() 在2个线程下同时调用 若 a 的类型是个结构体 可能会出现 a 没完全初始化 就被另一个线程返回了 不过只初始化一次是有保证的
会录 2014-01-21
  • 打赏
  • 举报
回复
就是初始化顺序的顺序问题。 我想解决的,正是: 假如全局变量A的初始化,依赖于全局变量B的初始值。 我有什么方法,可以确保全局变量B,必先会被初始化?
引用 18 楼 ganpengjin1 的回复:
引用 13 楼 luciferisnotsatan 的回复:
你要记住,工作中写的代码,是要给别人看的,也要给6个月后的你看的。 别说不确定的行为,就算是确定的,最好也写的清晰点。不然以后要花不少时间去搞懂当初写的这段代码是怎么运作的。
引用 14 楼 u013486147 的回复:
不是初始化了吗? [quote=引用 9 楼 ganpengjin1 的回复:] [quote=引用 2 楼 u013486147 的回复:] 那上面的代码,不能正确初始化,没有办法解决? [quote=引用 1 楼 ganpengjin1 的回复:] 没有规定,全局变量的初始化顺序
你在定义的时候初始化一下呗。[/quote][/quote] 这样没节操的代码,完全是给自己找麻烦,自己都不确定的代码,还指望别人看得懂? 深深蛋疼。 -------- 你说初始化了,你确实是初始化了,但是你能告诉我是按照哪个顺序初始的么?显然不能确定,也没有规定。[/quote]
乃不知有汉 2014-01-21
  • 打赏
  • 举报
回复
可以用函数的静态变量来 处理初始化顺序 int get_a() { static int a = 3; return a; } 但是在多线程下得小心 get_a() 在2个线程下同时调用 若 a 的类型是个结构体 可能会出现 a 没完全初始化 就被另一个线程返回了 不过只初始化一次是有保证的
漫步者、 2014-01-21
  • 打赏
  • 举报
回复
给你说下吧: int a1 = 1191; extern int b2; int b3 = b2 + 1; 好比这个,你确定是b2完之后再出初始化b3么,没人能够保证。
漫步者、 2014-01-21
  • 打赏
  • 举报
回复
引用 13 楼 luciferisnotsatan 的回复:
你要记住,工作中写的代码,是要给别人看的,也要给6个月后的你看的。 别说不确定的行为,就算是确定的,最好也写的清晰点。不然以后要花不少时间去搞懂当初写的这段代码是怎么运作的。
引用 14 楼 u013486147 的回复:
不是初始化了吗?
引用 9 楼 ganpengjin1 的回复:
[quote=引用 2 楼 u013486147 的回复:] 那上面的代码,不能正确初始化,没有办法解决? [quote=引用 1 楼 ganpengjin1 的回复:] 没有规定,全局变量的初始化顺序
你在定义的时候初始化一下呗。[/quote][/quote] 这样没节操的代码,完全是给自己找麻烦,自己都不确定的代码,还指望别人看得懂? 深深蛋疼。 -------- 你说初始化了,你确实是初始化了,但是你能告诉我是按照哪个顺序初始的么?显然不能确定,也没有规定。
会录 2014-01-21
  • 打赏
  • 举报
回复
我刚才封装了函数来初始化,还是有问题啊,结果还是不正确。 我现在的问题是:全局变量的初始化,需要依赖其他全局变量。 这里可能存在一些全局变量初始化的先后顺序问题,觉得比较难搞。
引用 16 楼 luciferisnotsatan 的回复:
引用 12 楼 u013486147 的回复:
那全局变量的使用,应该遵循什么原则? 或是没有原则?你有没有好的经验传授一下? [quote=引用 8 楼 luciferisnotsatan 的回复:] [quote=引用 6 楼 u013486147 的回复:] 导致不正确性的根源是? [quote=引用 5 楼 derekrose 的回复:] [quote=引用 4 楼 u013486147 的回复:] 这种代码有什么问题?违反了C++的什么规定?还是什么原则? [quote=引用 3 楼 luciferisnotsatan 的回复:] 谁让你写这种代码的。立刻收拾东西,然后找人事把工资结一下。
会导致不确定的行为 [/quote][/quote] C++对这些不做规定,是为了让编译器能够更好的优化代码。[/quote][/quote] 经验就是,别在全局里写这种代码。 extern int a1; int a2 = a1 + 1; extern int b1; int b2 = b1 + 1; 如过非要给全局做初始化,那就做个init函数,来赋值[/quote]
luciferisnotsatan 2014-01-21
  • 打赏
  • 举报
回复
引用 12 楼 u013486147 的回复:
那全局变量的使用,应该遵循什么原则? 或是没有原则?你有没有好的经验传授一下?
引用 8 楼 luciferisnotsatan 的回复:
[quote=引用 6 楼 u013486147 的回复:] 导致不正确性的根源是? [quote=引用 5 楼 derekrose 的回复:] [quote=引用 4 楼 u013486147 的回复:] 这种代码有什么问题?违反了C++的什么规定?还是什么原则? [quote=引用 3 楼 luciferisnotsatan 的回复:] 谁让你写这种代码的。立刻收拾东西,然后找人事把工资结一下。
会导致不确定的行为 [/quote][/quote] C++对这些不做规定,是为了让编译器能够更好的优化代码。[/quote][/quote] 经验就是,别在全局里写这种代码。 extern int a1; int a2 = a1 + 1; extern int b1; int b2 = b1 + 1; 如过非要给全局做初始化,那就做个init函数,来赋值
会录 2014-01-21
  • 打赏
  • 举报
回复
这只是随便写写的代码,是想测试一下全局变量的初始化的一些结果。 我上面的代码,为什么说是不确定行为? extern int a; int b = a; //这行就属于不确定行为? 因为b没有初始化为一个常量?不是很明白,哪里是不确定行为。。
引用 13 楼 luciferisnotsatan 的回复:
你要记住,工作中写的代码,是要给别人看的,也要给6个月后的你看的。 别说不确定的行为,就算是确定的,最好也写的清晰点。不然以后要花不少时间去搞懂当初写的这段代码是怎么运作的。
会录 2014-01-21
  • 打赏
  • 举报
回复
不是初始化了吗?
引用 9 楼 ganpengjin1 的回复:
引用 2 楼 u013486147 的回复:
那上面的代码,不能正确初始化,没有办法解决? [quote=引用 1 楼 ganpengjin1 的回复:] 没有规定,全局变量的初始化顺序
你在定义的时候初始化一下呗。[/quote]
luciferisnotsatan 2014-01-21
  • 打赏
  • 举报
回复
你要记住,工作中写的代码,是要给别人看的,也要给6个月后的你看的。 别说不确定的行为,就算是确定的,最好也写的清晰点。不然以后要花不少时间去搞懂当初写的这段代码是怎么运作的。
会录 2014-01-21
  • 打赏
  • 举报
回复
那全局变量的使用,应该遵循什么原则? 或是没有原则?你有没有好的经验传授一下?
引用 8 楼 luciferisnotsatan 的回复:
引用 6 楼 u013486147 的回复:
导致不正确性的根源是? [quote=引用 5 楼 derekrose 的回复:] [quote=引用 4 楼 u013486147 的回复:] 这种代码有什么问题?违反了C++的什么规定?还是什么原则? [quote=引用 3 楼 luciferisnotsatan 的回复:] 谁让你写这种代码的。立刻收拾东西,然后找人事把工资结一下。
会导致不确定的行为 [/quote][/quote] C++对这些不做规定,是为了让编译器能够更好的优化代码。[/quote]
YTerrenceLau 2014-01-21
  • 打赏
  • 举报
回复
目测违反了潜规则~~~~~~~~~
derekrose 2014-01-21
  • 打赏
  • 举报
回复
引用 7 楼 luciferisnotsatan 的回复:
引用 5 楼 derekrose 的回复:
[quote=引用 4 楼 u013486147 的回复:] 这种代码有什么问题?违反了C++的什么规定?还是什么原则? [quote=引用 3 楼 luciferisnotsatan 的回复:] 谁让你写这种代码的。立刻收拾东西,然后找人事把工资结一下。
会导致不确定的行为 [/quote] 不确定的行为会导致,目前程序跑得没问题,但之后做了些变动,如升级/更换的编译器,导致出了莫名奇妙的问题。结果一堆人排查了半天,原来是lz这代码造成的。[/quote] 楼主应该是学生吧。
加载更多回复(23)

65,186

社区成员

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

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