代码之家  ›  专栏  ›  技术社区  ›  Bruce

在C++中,编写在主程序之前执行的代码是好的形式吗?

  •  7
  • Bruce  · 技术社区  · 14 年前

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

    7 回复  |  直到 14 年前
        1
  •  18
  •   Stack Overflow is garbage    14 年前

    不是的 必要地 一个坏主意,但通常,是的。

    首先,是全局数据,全局数据通常是一件坏事。 你的国家越是全球化,你就越难对你的计划进行推理。

    第二,C++不能保证在不同的翻译单元(.CPP文件)中定义的静态对象的初始化顺序——如果它们相互依赖,那么你可能会遇到麻烦。

        2
  •  7
  •   bltxd    14 年前

    示例:目录 a.cpp

    #include <stdexcept>
    
    int f() { throw std::runtime_error("boom"); return 42; }
    int i = f();
    
    int main(int argc, char* argv[])
    {
      return 0;
    }
    

    g++ a.cpp && ./a.out

    terminate called after throwing an instance of 'std::runtime_error'
      what():  boom
    Aborted (core dumped)
    

    你可以尝试添加 try ... catch 总的来说,那没用。

    编辑:贾尔夫的观点也是有效的。听他的劝告。

        3
  •  1
  •   Ofir    14 年前

    除了形式可疑之外,它还不能移植到某些平台上。

        4
  •  1
  •   Sparky    14 年前

    正如你所指出的,这是允许的。在我工作过的上一家公司,当出现这种情况时,我们制定了一项政策,在main()中添加一个适当的注释,以指示该注释适用于哪些变量。如果你有一个糟糕的情况,尽量做到最好。

        5
  •  0
  •   valdo    14 年前

    将全局/静态对象与非平凡构造函数和析构函数一起使用 . 我看到了足够多的大型软件项目,它们发现自己陷入了一场灾难,因为它们不受控制地使用全局/静态对象和单音调。

    问题不在于代码是在外部运行的 main 不可控秩序 .

    每段代码都应该在定义良好的上下文中运行,所有变量都应该属于它。

        6
  •  0
  •   John    14 年前

    ,一点也不混乱。静态初始化是该语言的一个重要特性。你需要的时候就用吧。与globals相同。你需要的时候就用吧。像任何特性一样,知道它什么时候是合适的,知道它的局限性是成为一个强大的程序员的一部分。

    坏的形式是重新构造一个本来非常好的程序,只是为了避免全局或静态初始化。

        7
  •  0
  •   stinky472    14 年前

    // the following invokes undefined behavior.
    static bool success=cout<<"hello world\n";
    

    人们通常不会像上面那样编写代码,但要考虑success是否初始化为另一个函数的返回值。现在,任何试图在该函数中使用cout、cerr或任何其他全局对象的人都调用了相同的未定义行为。

    对于具有构造函数和析构函数的用户定义类型,请考虑访问为初始化的替代方法:

    static Foo& safe_static()
    {
        static Foo f;
        return f;
    }
    

    在我看来,这真的不值得让人头疼,而且这是一个比解决问题容易得多的问题。