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不同回答拼凑出来的想法
: 不知道有没有哪里理解错?或是能帮我多做补充的
: 谢谢!