20

C语言main函数的正确写法究竟是什么?

 4 years ago
source link: https://www.zhihu.com/question/263593464/answer/509591629
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

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

main函数版本

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

main()

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

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

void main()

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

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

int 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,有两个入参:

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。

Recommend

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK