我理解为什么C需要一个main函数来开始执行程序,但在我已经全部或部分阅读的三本书中,没有一本解释为什么程序以声明main为int或以void参数开始:
int main(void)
有人能告诉我这是为了什么吗?
main()
的返回值用于指示其父进程的成功或失败。更一般地说,它也可以用于通信特定的状态,尽管C没有定义这些状态。
如果main()
返回0
或EXIT_SUCCESS
,则程序成功。EXIT_FAILURE
或非零,则失败。
参数列表中的void
只是简单地表示它不接受任何参数。这是因为C的一个(错误)特性允许您声明一个函数,而无需完全指定它所使用的参数。声明为int func();
的函数可以用任意数量的参数调用,但int func(void);
只能用零调用。
示例
在linux上,
两个琐碎的程序:
$ cat ret0.c
int main (void) { return 0; }
$ cat ret42.c
int main (void) { return 42; }
Then in `bash` we can look at
$ ./ret0 ; echo $?
0
$ ./ret42 ; echo $?
42
因此,在调用程序时可以使用该状态。
int
返回用于向操作系统返回错误指示器。return 0
表示没有错误,所有其他代码(通常为return 1
)表示程序无法成功完成。其他程序(例如shell脚本)可以使用此错误代码来确定您的程序是执行了任务,还是遇到了问题。
void
只是意味着没有争论。它与相同
int main()
{
/* program */
}
但更明确。
程序可以采用命令行参数,在这种情况下,main
必须定义为
int main(int argc /* number of arguments */, char *argv[] /* arguments)
{
/* program
}
任何一本关于C的优秀书籍都应该对此进行解释。
首先让我们忘记main。在C(而不是C++)中,如果你定义了一个没有参数的函数,比如这个
int f(){ return 0;}
用任意数量的参数调用这样的函数是合法的:
int a = f(); /* legal */
int a = f("help", 1, 2.0); /* legal */
如果你想让函数f
只在没有参数的情况下工作,你可以这样修改它:
int f(void){return 0;}
int a = f(); /* legal */
int a = f("help", 1, 2.0); /* not legal as it has too many parameters */
这同样适用于main()
和main(void)
。在大多数情况下,在合理的世界里,大多数人永远不会在乎,但我在程序中遇到了调用main
的法律代码。
因此声明main
类似于:
int main() {
/* Do a bunch of stuff here */
}
允许程序中其他地方的代码执行此操作:
main();
main(1,2,3,4);
通过声明main(void)
,您添加了一个编译器检查,以阻止后一个示例main(1,2,3,4)
进行编译。
与C中的任何其他函数一样,main也是一个函数。因此,它具有返回类型,并且可以
接受论点。
int main(void)
这里int
是main的返回类型。许多人仍然使用"void",因为他们没有
用当前的语言标准更新自己。haccks的回答提到了
指定主要函数签名的最新标准
将int作为main的返回类型是一种通用的、良好的做法,因为它"告诉"main的父进程程序的终止(成功/失败)。
与任何其他函数一样,main也能够接受参数,但有一个例外,即main的参数是在程序开始执行之前给定的。这些被称为"命令行参数"
main可以通过两种方式接受参数:
1. int main(void)
or
int main()
2. int main(int argc, char *argv[])
or
int main(int argc, char **argv)
第一个声明说main不需要任何参数,其中作为第二个声明符-
-tion希望用户向main提供命令行参数。
注意:main应该接受0或2个参数。如果您试图给出
的任意数字除了这些参数之外,当您编译代码时,它会发出以下警告
warning: ‘main’ takes only zero or two arguments [-Wmain]
编辑:如果您正在使用gcc,则会显示上述警告。