作为来自python的C++的新手,我不确定为什么C++不允许代码在函数之外(在全局命名空间中?)。在main()被调用之前做一些初始化或者甚至声明了其他函数之前,这似乎是有用的。 (我不想与编译器争论,我只想知道以这种方式实现它后面的思考过程。)为什么必须在函数中包含C++代码?
回答
当你运行一个python程序时,解释器从头到尾底部正在执行。在C++中,这不会发生。编译器将所有函数构建成小块的机器代码,然后链接器将它们挂钩。在运行时,操作系统调用您的main
函数,并且从那里开始一切。在这种情况下,函数之外的代码是毫无意义的 - 它何时会运行?
这个答案帮助了很多关键的想法,我有点在我的学习C++淡化;即它是一种编译语言。 – 2013-03-11 05:48:51
我假设这也是C的情况? – 2013-03-11 05:55:33
是的,C也是一样。 – 2013-03-11 05:57:17
main()是程序的接入点。所以你想写的任何代码都需要从那一点开始执行。
静态变量在执行main()之前启动,因此您可以在此之前启动所需的任何变量。
但是,如果你想运行启动程序状态的代码,你应该在程序开始时执行它,并滥用静态变量并为其构造一些构造函数。
这可以认为是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()
函数注册的函数。
- 1. 必须包含\ n Xcode C
- 2. 为什么我必须在这段代码中使用(flush)?
- 3. 为什么一个type = html gadget必须包含CDATA部分?
- 4. 为什么虚拟函数必须在超类中实现?
- 5. 在异步函数中,为什么我必须等待?
- 6. 我们必须在函数“return”的末尾写什么?在C++
- 7. 为什么jsp中的EL函数必须声明为静态?
- 8. 为什么我为Symfony验证yaml文件获取“必须包含YAML数组”?
- 9. 从C#代码触发PS1文件。 C#代码必须包装在exe
- 10. 为什么setOnClickListener()必须在onCreate()中?
- 11. 为什么我必须将函数放在另一个函数中?
- 12. 为什么盐被包含在用C crypt函数哈希
- 13. 德尔福XE4我必须包括什么使用函数FmxHandleToObjC
- 14. 为什么原型必须在构造函数之外声明?
- 15. 为什么我必须使用“本”在函数的
- 16. 为什么我明确地必须在这里声明函数?
- 17. 为什么我必须纠正春天的代码?
- 18. 为什么包含的代码在bash中不起作用?
- 19. C中的代码中包含了什么?
- 20. 为什么在python中迭代字典时必须调用.iteritems()?
- 21. 为什么我必须在React的匿名函数中包装我的onClick属性的函数?
- 22. 什么标题必须包含使用wsprintf使用MinGW
- 23. Jquery Mobile - 如何使用ScrollView ...我必须包含什么?
- 24. 为什么我必须在客户端代码中引用ExceptionHandling.Logging dll?
- 25. 为什么我必须在这段代码中使用额外的方法?
- 26. 在“现代C++设计”中,为什么PrototypeFactoryUnit :: GetPrototype必须调用DoGetPrototype?
- 27. 这个代码在构造函数中有什么含义
- 28. 当autopostback必须设置为true(包含代码)时,无回传的Dropdownlist
- 29. 为什么调用函数时必须“抛出异常”?
- 30. 为什么相机必须在OpenGL
如果没有函数,这样的代码将如何执行? – 2013-03-11 05:38:59
在'main'之前还有一些方法可以在不涉及混乱的全局代码的情况下执行代码。 – chris 2013-03-11 05:39:14
似乎没有那么有用。 – 2013-03-11 05:39:56