在C++中,编写在main()之前执行的代码是否很好?

Bru*_*uce 7 c++ constructor

在输入main之前调用全局声明的类的构造函数.虽然这可能会让代码的新读者感到困惑,因为它很少这样做,但它一定是个坏主意吗?

jal*_*alf 18

不一定是个坏主意,但通常是的.

首先,它是全局数据,而全局数据通常是一件坏事.你拥有的全球状态越多,推理你的计划就越难.

其次,C++不保证在不同的翻译单元(.cpp文件)中定义的静态对象的初始化顺序 - 所以如果它们相互依赖,你可能会遇到麻烦.


blt*_*txd 7

是的,这很糟糕.由于您无法捕获异常并处理它们,因此将使用默认处理程序.在C++中,这意味着调用terminate ...

示例:内容 a.cpp

#include <stdexcept>

int f() { throw std::runtime_error("boom"); return 42; }
int i = f();

int main(int argc, char* argv[])
{
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

产量: g++ a.cpp && ./a.out

terminate called after throwing an instance of 'std::runtime_error'
  what():  boom
Aborted (core dumped)
Run Code Online (Sandbox Code Playgroud)

你可以尝试try ... catch在你的主要添加一个,这将无济于事.

编辑:贾尔夫的观点也是有效的.听听他的建议.