为什么C++语句必须包含在函数中?
作为一个刚接触C++的新手,之前用过Python,我不太明白为什么C++不允许在函数外面写语句(也就是在全局命名空间里)。这样做似乎可以在调用main()之前或者其他函数还没声明之前进行一些初始化。(我不是想跟编译器争论,只是想了解这样设计背后的思路。)
3 个回答
main() 是程序的入口点。也就是说,你想写的任何代码都需要从这个点开始执行。
静态变量在 main() 执行之前就会被初始化,所以你可以在这之前设置好你需要的变量。
但是如果你想运行一些代码来初始化程序的状态,最好在程序一开始就做这件事,可以利用静态变量,或者用构造函数来实现。
这可以看作是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()
函数注册的函数。
当你运行一个Python程序时,解释器会从上到下逐行执行代码,边执行边处理。而在C++中,情况就不一样了。C++的编译器会把你写的所有函数转换成一小块一小块的机器代码,然后链接器把这些代码连接起来。在程序运行时,操作系统会调用你的main
函数,然后程序就从这里开始运行。在这个过程中,函数外的代码是没有意义的——因为它什么时候会被执行呢?