前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >C语言的main函数到底该怎么写

C语言的main函数到底该怎么写

作者头像
编程珠玑
发布2019-09-03 10:54:36
1.4K0
发布2019-09-03 10:54:36
举报
文章被收录于专栏:编程珠玑编程珠玑

前言

main函数是程序执行自定义的第一个函数。从开始学习C语言到现在,我们似乎看到了很多个版本的main函数,那么哪一种才是正确的呢?我们先来看看目前有哪些版本。

main函数版本

第一种,没有返回值,没有入参:

代码语言:javascript
复制
main()

在C89标准中,这种写法是可以接受的,但使用现在的编译器编译时,会报告警,并且会将其返回值默认为int。实际上,如果函数没有显式声明返回类型,那么编译器会将返回值默认为int。

第二种,返回值为void,没有入参:

代码语言:javascript
复制
void main()

这种形式的来源不得而知。但是为何这么多初学者使用?main函数的返回值最终会作为程序的退出状态,而一旦声明为void,在程序退出后,想要获取其退出状态也就不可以了。因此不建议其返回值为void。

第三种,返回值为int,参数为void:

代码语言:javascript
复制
int main(void)

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

第四种,返回值为int,没有参数:

代码语言:javascript
复制
int main()

看起来似乎和第三种没有什么区别,但这种形式却有些许不同。虽然它的声明没有入参,实际调用却可以传入参数,看下面的例子:

代码语言:javascript
复制
#include<stdio.h>
void  test();
int main() 
{ 
    test(4);
    return 0; 
}
void test(int a)
{
    printf("%d",a);
}

对于上面的程序,我们仍然可以编译并正常运行,test函数虽然声明为无入参,但调用时却是可以传入任何参数或不传参数的。

第五种,返回值为int,有两个入参:

代码语言:javascript
复制
int main(int argc,char *argv[])

这也是最常见的一种写法。第一个入参为命令行参数个数,第二个入参为命令行参数数组。通常用于实现需要从命令行获取参数的功能。

第六种,返回值为int,有三个入参:

代码语言:javascript
复制
int main(int argc,char *argv[],char *envp[]

这种和第五种相似,但多了一个参数,用于获取环境变量,这种形式多源于编译器的扩展。但全局变量environ可以代替envp的作用,获取或者设置环境变量可以使用getenv或putenv,因此也没有必要使用该形式。

没想到吧,仔细数一数竟然有这么种写法?但是真相究竟如何?到底使用哪种呢?

真相大白

C89/C99/C11标准文档中只提供了两种main函数的写法

代码语言:javascript
复制
int main(void) { /* ... */ }

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

也就是说,其他的写法都是不符合标准的,有的是历史遗留问题,有的是编译器扩展,更有的不知从何而来。当然对于带参数的写法,其参数名可自定义。另外对于除标准提供的以外的写法,不同的编译器有不同的处理策略,有的可能编译不过,有的可能报警告,但一个“正经”的编译器是不会对标准提供的形式产生质疑的。

总结

至此,我们已经知道了c语言main函数的写法,我们来总结一下前面的内容:

  • C标准只提供了两种main的形式,即前面提到的第三种和第五种。
  • 为了代码的通用可移植性,建议采用标准提供的形式。
  • 不需要命令行参数可采用第三种,需要命令行参数采用第五种。
  • 如果一个函数确定无需传入任何参数,那么用void限定是一个不错的选择。
  • 函数没有声明返回值时,编译器默认其返回值为int。
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2018-10-13,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 编程珠玑 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • main函数版本
  • 真相大白
  • 总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档