繁体   English   中英

为什么c ++代码必须包含在函数中?

[英]Why must c++ code be contained within functions?

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

当你运行一个python程序时,解释器会在它执行时从上到下运行它。 在C ++中,这不会发生。 编译器将所有函数构建到一小撮机器代码中,然后链接器将它们连接起来。 在运行时,操作系统调用您的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()函数注册的函数。

main()是程序的访问点。 因此,您想编写的任何代码都需要从该点开始执行。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM