4

C++03 标准[basic.start.init] 第 3 点状态:

命名空间范围的对象的动态初始化(8.5、9.4、12.1、12.6.1)是否在main的第一条语句之前完成是实现定义的。如果初始化延迟到 main 的第一个语句之后的某个时间点,它应该发生在第一次使用与要初始化的对象相同的翻译单元中定义的任何函数或对象之前。

Microsoft 编译器,根据Additional Startup Considerations,在main().

我一直无法获得说明 GNU 和 Sun Forte 编译器行为的文档。

任何人都可以:

  1. 指向描述 GNU 和 Forte 编译器在动态初始化方面的行为的文档方向(我已经检查了 GCC 手册,没有发现与动态初始化相关的任何内容)。
  2. 评论延迟动态初始化的线程安全(如果两个线程尝试从包含非本地对象的同一翻译单元调用函数)。

FWIW,我观察了 GNU 的 g++ 和 SUN 的 CC 的行为,并且都在 main 之前执行了初始化,尽管我不接受这是一个明确的答案。(如果有人感兴趣,我可以发布我用来观察的非常简单的代码,但我觉得这个问题已经足够长了

4

1 回答 1

5

明确的答案是所有编译器都在之前进行静态初始化main除非对象位于稍后加载的 DLL 中。在实践中,(几乎)不可能满足您引用的文本中的要求。(想想如果有一个循环会发生什么。)

于 2012-09-07T16:33:52.233 回答