【C语言】main 函数的正确写法

作者在C语言的学习中发现,目前领域内的教科书、源代码中有多种版本的 main 函数在广泛使用。那么到底哪一种才是正确的呢?让我们先来看看目前广泛使用的有哪些版本:

版本一:没有返回值,没有参数

main()

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

版本二:返回值为void,没有参数

void main()

有些编译器允许这种形式,但是还没有任何标准考虑接受它。C++ 之父 Bjarne Stroustrup 在他的主页上的 FAQ 中明确地表示:void main( ) 的定义从来就不存在于 C++ 或者 C 。所以,编译器不必接受这种形式,而且很多编译器也不允许这么写。main函数的返回值最终会作为程序的退出状态,而一旦声明为void,在程序退出后,想要获取其退出状态也就不可以了。因此不建议其返回值为void。

版本三:返回值为int,没有参数

int main()

这也是很常见的一种。虽然其声明没有入参,实际调用却可以传入参数,看下面的例子:

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

test函数虽然声明为无入参,但调用时却是可以传入任何参数或不传参数的。

版本四:返回值为int,参数为void

int main(void)

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

版本五:返回值为int,有两个入参

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

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

版本六:返回值为int,有三个入参,分别为命令行参数个数,命令参数数组,环境变量数组

int main(int argc,char *argv[],char *envp[]

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

总结

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

int main(void) { /* ... */ }

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

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

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

  • C标准只提供了两种main的形式,即前面提到的第四种和第五种。
  • 为了代码的通用可移植性,建议采用标准提供的形式。
  • 不需要命令行参数可采用第四种,需要命令行参数采用第五种。
  • 如果一个函数确定无需传入任何参数,那么用void限定是一个不错的选择。
  • 函数没有声明返回值时,编译器默认其返回值为int。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

天天の进阶之路

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值