

C语言main函数的正确写法究竟是什么?
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.

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
-
5
C语言函数究竟应该使用 0 还是 1表示成功? 发表于 2019-10-29 08:10:54...
-
8
C语言程序开发中,网络通信库函数recv函数,究竟应该传递多大的内存给它? 发表于...
-
17
C语言程序开发中,调用 malloc() 函数时究竟需不需要做类型转换? 发表于 20...
-
18
C语言怎样传递main()函数的两个参数 发表于 2019-07-15 08:07:09...
-
7
写法1 - 使用 function 关键字function greeter(fn: (a: string) => void) { fn("Hello, World"); } function printToConsole(s: string) { console.log(s); } greeter(printToConsole);(a: string) =&g...
-
8
V2EX › Go golang 函数返回值 2 个写法,哪个更好? wangbenjun5 · 1 天前 via Android · 20...
-
9
PHP 字符串中直接解析函数的写法PHP 中的字符串理论上是不能够解析函数的,仅能够解析变量。最近发现一种特殊的写法,是可以让字符串直接解析函数的。// 单行 ${!${''} = 代码} // 多行 ${!${''} = 代码 }个人认为这种写法实际...
-
5
main 函数 又称主函数,是程序执行的起点。 在 main 函数之前 那么,我们有办法在 main 函数之前执行代码吗? 答案是肯定的。 before_main.c #include <stdio.h> __attribute((construct...
-
8
Google AdSense收款地址的正确写法 姓名方面外国人习惯是名(Firstname)在前,姓(Lastname)在后。若碰到让您一起填的,最好要注意一下顺序,不过你要是填反了,也没关系。中国银行收支票时是都承认的。例如:刘刚,可写成GangLiu,也可写成Li...
-
9
css注释的正确写法(html里面的css规范注释快捷键)
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK