8

作为来自 python 的 c++ 新手,我不确定为什么 c++ 不允许函数之外的代码(在全局命名空间中?)。在调用 main() 或什至声明其他函数之前进行一些初始化似乎很有用。(我不是想与编译器争论,我只是想知道以这种方式实现它背后的思考过程。)

4

3 回答 3

14

当你运行一个 python 程序时,解释器会从上到下运行它。在 C++ 中,这不会发生。编译器将所有函数构建成机器代码的小块,然后链接器将它们连接起来。在运行时,操作系统调用你的main函数,一切都从那里开始。在这种情况下,函数之外的代码是没有意义的——它什么时候运行?

于 2013-03-11T05:39:26.153 回答
3

这可以被认为是 C++ 和 Python 之间的风格差异。但是,它也有很好的理由。在 C 和 C++ 中,有一个非常明确和具体的地方是你的代码执行的开始,那就是main()函数的开始(当然,这只是一个近似值,但我们现在可以忽略它。 ) 实际上,C/C++ 程序以函数开始和结束main()——在我看来——当你想了解程序的实际作用时,它很有帮助。程序的高层流程更加清晰。将此与替代方案进行对比;代码分散在整个文件中以及函数之间。

即使在一个组织良好且非平凡的 Python 程序中,你也将你的主体代码放在一个. 下if __name__ == "__main__":,不是吗?

现在介绍一些更高级的东西。main()有一些方法可以在调用函数之前运行代码。这是其中之一:

#include <iostream>
using namespace std;

bool RunBeforeMain ()
{
    cout << "Before main()!" << endl;
    return true;
}

// This variable here causes the above function to be called
bool ignore_this_variable = RunBeforeMain ();

int main ()
{
    cout << "Start of main()" << endl;
    return 0;
}

此外,所有全局变量的构造函数和static类的所有成员以及一些依赖于平台的东西都在之前运行main()。类似地,有一些方法可以让代码在main()完成后运行。这些通常是在main()开始之前构造的对象的析构函数,以及向该函数注册的atexit()函数。

于 2013-03-11T06:04:31.757 回答
1

main() 是程序的访问点。因此,您要编写的任何代码都需要从那时起具有执行顺序。

静态变量在 main() 执行之前启动,因此您可以在此之前启动您需要的任何变量。

但是如果你想运行启动程序状态的代码,你应该在程序的开头就这样做,并滥用静态变量并做一些构造函数。

于 2013-03-11T05:41:58.237 回答