编程语言一定需要main函数吗?函数入口一定是main吗?main方法可以是private私有?main函数一定返回int吗?exit(n)并不完全等价main函数return (n)?

目录

编程语言一定需要main函数吗?

函数入口一定是main吗?

main函数

脚本语言的入口

main真的是入口吗?

main函数参数

main方法可以是private私有?

主类需要的public吗?

为什么经常看到main函数最后return 0?

main函数一定返回int吗?

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等编程技术的技巧经验分享),若作品对您有帮助,请关注、分享、点赞、收藏、在看、喜欢,您的支持是我们为您提供帮助的最大动力。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值