2013-03-11 99 views
5

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

+0

如果没有函数,这样的代码将如何执行? – 2013-03-11 05:38:59

+0

在'main'之前还有一些方法可以在不涉及混乱的全局代码的情况下执行代码。 – chris 2013-03-11 05:39:14

+1

似乎没有那么有用。 – 2013-03-11 05:39:56

回答

12

当你运行一个python程序时,解释器从头到尾底部正在执行。在C++中,这不会发生。编译器将所有函数构建成小块的机器代码,然后链接器将它们挂钩。在运行时,操作系统调用您的main函数,并且从那里开始一切。在这种情况下,函数之外的代码是毫无意义的 - 它何时会运行?

+0

这个答案帮助了很多关键的想法,我有点在我的学习C++淡化;即它是一种编译语言。 – 2013-03-11 05:48:51

+0

我假设这也是C的情况? – 2013-03-11 05:55:33

+0

是的,C也是一样。 – 2013-03-11 05:57:17

1

main()是程序的接入点。所以你想写的任何代码都需要从那一点开始执行。

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

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

3

这可以认为是C++和Python之间的风格差异。但是,它也有很好的理由。在C和C++中,代码的执行起始于一个非常明确和特定的地方,这就是函数的开始(当然,这只是对事实的近似,但我们现在可以忽略这一点)实际上,一个C/C++程序以main()函数开始和结束,在我看来,这个函数有很多帮助,当你想了解一个程序实际上做了什么。程序的高层流程更清晰。将这与另一种对比;代码分散在整个文件中,在函数和whatnot之间。

即使在一个组织良好,非平凡的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()函数注册的函数。

相关问题