打印

你有没有想过,C语言 main 函数到底为啥这么写?

[复制链接]
443|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 微信小助手 于 2020-3-10 21:13 编辑

童靴们
熊猫老师的小课堂来啦
学过C语言的
基本上肯定是要先学main函数
但是学了这么久
各种形式都有
哪种才是对的呢?
今天我们就来聊聊main函数

那么main函数一共有多少个版本呢?

1、main()

直接的mian()并没有返回值,没有入参。这种写法实际来说,部分编译器会显示警告,并且会返回默认值为int。不过在C89标准中其实是可以的,由于没有声明返回类型,所以才会返回默认值int。

2、void main()

初学者经常会使用的形式,但是并不知道来源在哪,在C89/C99/C11等文档中都没有提到这种形式的痕迹。这种写法的返回值是void,没有参数。值得注意的是,一旦声明是void,在程序退出后,想要获取其退出状态也就不可以了。所以还是不建议返回值为void的。

3、int main(void)

比较常见的写法,这种写法的形参为void,表明它在调用的时候不能传入任何参数,那么它也就不能获取命令行参数了。

4、int main ()

和上面第3种看起来好像没啥区别,但是还是有些许不同。就下面例子来说:

#include<stdio.h>
void  test();
int main()
{
    test(4);
    return 0;
}
void test(int a)
{
    printf("%d",a);
}

程序仍然可以正常运行,test函数虽然声明为无入参,但调用时却是可以传入任何参数或不传参数的。

5、int main(int argc,char *argv[])

int argc入参为命令行参数个数,char *argv[]入参为命令行参数数组。这种写法也比较常见的,主要用在需要从命令行获取参数的功能。

6、int main(int argc,char *argv[],char *envp[])

包含三个参数的一种写法,上面第5种的升级版,int argc是命令行参数个数,char *argv[]是命令参数数组,char *envp[]是环境变量数组。虽然只比第六种多了一个参数,但全局变量environ可以代替envp的作用,获取或者设置环境变量可以使用getenv或putenv,因此也没有必要使用该形式。这种写法多源于编译器的扩展。

上面写了这么多种写法,那么到底写哪种才算是对的?

查阅C89/C99/C11标准文档,里面明确固定了两种写法:

int main(void) { /* ... */ }
int main(int argc, char *argv[]) { /* ... */ }

所以说,其他的写法并不符合标准,有些算是历史遗留有些算是编译器的扩展,还有些不知道从哪里生出来的。
所以说了这么多,为了代码的通用可移植性,建议采用标准提供的形式,还是推荐使用标准文档中规定的这两种写法。如果一个函数确定无需传入任何参数,那么用void限定是一个不错的选择。

所以说,你明白要怎么写main函数了吗?


免责声明:整理本文出于传播相关技术知识,版权归原作者所有。

学会了吗?

学会了的话,给我们的公众号来个关注呗~么么哒

以上内容来源于公众号「嵌入式ARM」
每天教你一个小知识
扫码关注更多


使用特权

评论回复
评论
微信小助手 2020-3-11 14:43 回复TA
@hobbye501 :这个习惯好~是标准文档的写法。很多人都会莫名写成void main() 
hobbye501 2020-3-11 14:14 回复TA
int main(void)一直这么写的 也不知道为啥 习惯了 

相关帖子

沙发
nccdap| | 2020-3-11 16:00 | 只看该作者
从基础就要严格要求,标准代码

使用特权

评论回复
板凳
微信小助手|  楼主 | 2020-3-11 16:17 | 只看该作者
nccdap 发表于 2020-3-11 16:00
从基础就要严格要求,标准代码

“代码不规范 同事两行泪”

使用特权

评论回复
地板
ygd8718| | 2020-3-16 14:32 | 只看该作者
条理严谨,简捷至尚,大家风范。

使用特权

评论回复
5
微信小助手|  楼主 | 2020-3-16 16:47 | 只看该作者
ygd8718 发表于 2020-3-16 14:32
条理严谨,简捷至尚,大家风范。

感谢支持

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

81

主题

139

帖子

2

粉丝