【问题标题】:Difference between C and C++ static initialization [duplicate]C和C ++静态初始化之间的区别[重复]
【发布时间】:2014-01-11 10:31:20
【问题描述】:

编译此代码示例时

#include <stdio.h>
#include <stdlib.h>

int myfunc()
{
    printf("Constructor\n");
    return 1;
}

static const int dummy = myfunc();

int main()
{
    printf("main\n");
    return 0;
}

它在编译为 C++ 时可以工作,但不能作为 C 使用相同的编译器 (MingW gcc)。我在 C 模式下得到一个initializer element is not constant

所以显然在静态初始化方面存在差异。有没有理由为什么 C++ 显然允许这样做,但 C 却不允许这样做?这是因为否则您将无法拥有带有构造函数的全局对象吗?

【问题讨论】:

  • C 应该尽可能简单。非静态初始化需要存在在调用main() 之前触发的启动/构造函数例程。显然,C++ 标准委员会可以接受这个要求,但 C 人不喜欢它(我可以理解)。
  • SO 应该仅限于技术问题,而不是基于意见的推测,为什么这个或那个特性存在于一种语言而不是另一种语言中。投票结束:许多好的问题会根据专家的经验产生一定程度的意见,但这个问题的答案往往几乎完全基于意见,而不是事实、参考资料或特定专业知识。
  • @JensGustedt,为什么这是基于意见的?我不认为标准是根据喜好改变的。我什至举了一个例子,为什么我认为有必要在 C++ 中允许这样做,所以我希望答案是技术原因。

标签: c++ c


【解决方案1】:

C++ 编译器生成一个附加的“Start”函数,其中所有“全局函数调用”都在 PC(程序计数器)设置为“main”地址之前执行。

“全局函数调用”是为了初始化全局对象而执行的任何函数调用(包括隐式函数调用,即构造函数)。

C 编译器不会生成这样的“开始”函数,并且一旦操作系统加载可执行文件并运行进程,PC 就会设置为“主”。

【讨论】:

  • 你有什么参考资料可以备份吗?
  • 我可以根据我的个人经验说,在调用 main() 之前,C++ 静态 ctor 中的错误会炸毁我的系统:) 我已经通过调用静态 ctor 的 crt 进行了调试,它肯定发生在 main 之前。
  • 有趣的事实:C 程序也永远不会从 main 开始(main 返回一个返回码,但仍然必须调用 exit 来向操作系统发出该代码)。
  • 这个答案显然(至少部分)是错误的。 Main 不是进程入口点,因为这里涉及到 CRT 启动,它会在调用 main 之前准备运行时环境。从编译器的角度来看,main 只是另一个函数。 CRT 启动除其他外负责初始化静态变量。
猜你喜欢
  • 1970-01-01
  • 2013-12-02
  • 2010-12-11
  • 2014-07-26
  • 1970-01-01
  • 1970-01-01
  • 2011-10-06
  • 1970-01-01
  • 2010-10-30
相关资源
最近更新 更多