为什么C++语句必须包含在函数中?

9 投票
3 回答
799 浏览
提问于 2025-04-17 18:39

作为一个刚接触C++的新手,之前用过Python,我不太明白为什么C++不允许在函数外面写语句(也就是在全局命名空间里)。这样做似乎可以在调用main()之前或者其他函数还没声明之前进行一些初始化。(我不是想跟编译器争论,只是想了解这样设计背后的思路。)

3 个回答

1

main() 是程序的入口点。也就是说,你想写的任何代码都需要从这个点开始执行。

静态变量在 main() 执行之前就会被初始化,所以你可以在这之前设置好你需要的变量。

但是如果你想运行一些代码来初始化程序的状态,最好在程序一开始就做这件事,可以利用静态变量,或者用构造函数来实现。

4

这可以看作是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()函数注册的函数。

16

当你运行一个Python程序时,解释器会从上到下逐行执行代码,边执行边处理。而在C++中,情况就不一样了。C++的编译器会把你写的所有函数转换成一小块一小块的机器代码,然后链接器把这些代码连接起来。在程序运行时,操作系统会调用你的main函数,然后程序就从这里开始运行。在这个过程中,函数外的代码是没有意义的——因为它什么时候会被执行呢?

撰写回答