Re: [问题] 全域变量在C/C++的初始化

楼主: descent (“雄辩是银,沉默是金”)   2015-12-27 20:54:00
c++ 可以这么做是因为插入了某一段程式码,
并在某个时候去执行这段程式码,
所以可以这么做是要付出某些代价的。
global object 就是用这样的方式唤起 ctor。
想知道整个详细的过程可以看看这篇:
http://descent-incoming.blogspot.tw/2012/09/c-c-global-variable-initialize.html
如果你有兴趣这个技术, 可以参考这几篇文章:
http://descent-incoming.blogspot.tw/2015/12/c-runtime-article-content.html
用个简单的说法:
c++ 会插入一个 function global_a
global_a 会去作 b=a 这件事情。
而 c++ runtime library 会有一段程式码去呼叫 global_a()
这就是 c++ 可以做到而 c 做不到的祕密。
也就是 c++ 被人家诟病总是在程式员不知道的地方插入很多程式码,
是个黑箱。
※ 引述《NaiveRed (天真红)》之铭言:
: 开发平台(Platform): (Ex: VC++, GCC, Linux, ...)
: Dev c++,VS
: 问题(Question):
: 一开始是遇到了这个问题
: int a = 10;
: int b = a;
: int main(){return 0;}
: 在C是不行的,错误讯息: initializer element is not constant
: C++则没问题
: 所以我改成
: const int a = 10;
: int b = a;
: int main(){return 0;}
: 依旧是不行
: 查了一下知道了大概的理由,但还是有点不知所以
: 看完后的理解是:
: C在初始化全域变量时需要constant expressions,因为他是存在Data segment
: 然后在C++初始化全域变量时则不需要
: 至于加了const后还是不行则是因为在C里不算是标准的constant expressions
: 他需要compile-time constant(全域变量是在compile time初始化的)
: (以上是从stackoverflow不同回答拼凑出来的想法
: 不知道有没有哪里理解错?或是能帮我多做补充的
: 谢谢!
作者: NaiveRed (天真红)   2015-12-27 22:09:00
感谢你的简单说法和文章!
作者: grayStone (灰色石头)   2015-12-28 03:09:00
推黑箱
作者: RealJack   2015-12-28 09:37:00
果然魔鬼藏在细节
作者: fr3ak (fr3@K)   2015-12-28 10:24:00
黑箱的意思是 spec 里面没有提到对吧? 先说我懒得翻 (逃~)平衡一下. 印象中 pre11 的 spec 似乎对 global/static 着墨较少. 但自 11 开始就有显著的改善 (还是没翻 spec QQ)年纪大了, 有时些时候资讯来源是 spec, CPPOM 或是早期 implementer 的实做记不是那么清楚 T_T
楼主: descent (“雄辩是银,沉默是金”)   2015-12-28 12:52:00
这是 gcc 的实作方式, 不同 compiler 也许有不同的方法

Links booklink

Contact Us: admin [ a t ] ucptt.com