目录
exit(n)并不完全等价main函数return (n)?
编程语言一定需要main函数吗?
不一定。
- 解释型或脚本语言倾向于从前到后执行,不一定需要main函数。
- 如果编译为库,不需要入口函数。
具体而言:
- Shell/Batch批处理/JavaScript默认从前往后执行。
- Python如果没有__main__, 也是从前到后执行。
- C/ObjC/C++/Java/C#/Rust/Go/仓颉都需要有main函数,注意C#是大写开头的Main.
- Swift的设计哲学是简约,不需要用main函数,如果代码没有main函数,编译器会默认生成一个main函数。
func main() {
// 你的程序代码
}
main() - VB6 GUI程序没有显式的main函数,事件驱动依赖形如From_Load事件函数应需执行。但VB.NET控制台应用程序需要显式的Main函数为入口。
函数入口一定是main吗?
不一定,只是一般给程序员的说法是入口是main. 从进程运行的角度,操作系统加载器会调用对应程序开始运行的准备库,最终调用用户层代码main函数作为入口。
- VC++可设定#pragma comment(linker,"/entry:new_main_entry")指定入口点。
- C# csc提供 /main:<class_name> 可指定入口类,dotnet提供 /p:StartObject=<class_name> 指定入口类。
main函数
基本每种编译型语言都有一个主入口,又被称为main函数。不同语言main名称可能有不同,C#用Main函数。另外,有的语言编译器也可以指定入口位置,完全不用遵循main.
脚本语言的入口
- 脚本语言被简单解释执行,一般顺序执行,没有入口一说。Python特别提供__main__指定入口。
main真的是入口吗?
- 从操作系统和库的角度,main函数并不是程序或进程的第一入口,算是回调到程序员源代码的入口。程序员看到main,代表执行到写的代码的入口,其实操作系统和库早已为程序运行准备了,它们的入口隐藏在main上级。
main函数参数
- C# 参数可以是void或者string数组。
Main() 或者 Main(string[] args)- 特别注意:args不包含程序名,和C/C++不同。即当以1和2作为参数运行程序myapp 1 2,args是1和2,不包含myapp.
- Environment.CommandLine是包含程序名的完整参数信息。
main方法可以是private私有?
一般意义而言,main方法是公开开放的,public类型是最常见。这对于Java而言没有问题,它的main函数必须是public.
- C#降低了对Main方法的约束,不一定是public,private/protected同样可以通过编译。根源在于CLR是以中间语言IL .entrypoint标记入口,对Main方法限制符毫不关心,看来CLR把Main方法当成自己人了。
- C++语法不允许入口函数main函数不能用private或者public修饰。
主类需要的public吗?
- Java主类(包含main方法的类)一定需要的public修饰。
为什么经常看到main函数最后return 0?
为了配合shell获取返回值,一般而言shell认为程序返回值为0代表正确,非0代表失败。
main函数一定返回int吗?
不一定。
- C/ObjC用void main()也是可以的。但是不建议,因为这样忽略了返回值,如果程序被脚本调用,脚本无法知道程序返回的真实值。
- GCC编译C/ObjC允许main返回void,clang只允许返回int.
- C++ main函数一定是int, 对于非int类型,G++/Clang编译器会报错:'main' must return 'int'
- 仓颉编程语言main函数可以返回Int64, 也可以没有返回值。
- C# Main函数可以返回void,也可以是int.
- Java要求main函数一定返回void.
- Go main函数一定没有返回值,如果增加返回值会报错:
func main must have no arguments and no return values - Rust main函数也默认返回空,不能用其他类型。
- Swift允许main函数返回空,也可以返回Int.
- VB.NET控制台应用程序Main函数可以返回空,也可以返回Integer,但不能是其他类型。
- Python不需要显式返回一个数值,比如return或者exit函数。
exit(n)并不完全等价main函数return (n)?
如果main函数里面有atexit注册的函数或者设定了一些需要清理的API,比如setvbuf. 这种情况下,exit (n)是最好的做法,直接return (n)可能导致资源未释放。
若文章对您有帮助,欢迎关注 程序员小迷 。助您在编程路上越走越好!
微风不燥,阳光正好,你就像风一样经过这里,愿你停留的片刻温暖舒心。
我是 程序员小迷 (致力于C、C++、C#、Android、iOS、Java、Kotlin、Objective-C、Swift、Shell、JavaScript、TypeScript、Python等编程技术的技巧经验分享),若作品对您有帮助,请关注、分享、点赞、收藏、在看、喜欢,您的支持是我们为您提供帮助的最大动力。