Mil*_*der 13 c program-entry-point
很多人都熟悉C语言中的hello world程序:
#include <stdio.h>
main ()
{
printf ("hello world");
return 0;
}
Run Code Online (Sandbox Code Playgroud)
为什么有些在main()
函数之前,int
如下所示:
int main()
Run Code Online (Sandbox Code Playgroud)
另外,我已经看到void
输入的内容()
如下:
int main(void)
Run Code Online (Sandbox Code Playgroud)
这似乎是额外的打字,但也许这是一个在其他情况下支付红利的最佳做法?
另外,main()
如果你要返回一个字符串,为什么会先加一个int?如果有的话,人们会期望:
char main(void)
Run Code Online (Sandbox Code Playgroud)
关于为什么我们在函数结束时返回0也很模糊.
SLa*_*aks 13
该main
函数返回一个整数状态代码,告诉操作系统程序是否已成功退出.
return 0
表示成功; 返回任何其他值表示失败.
因为这是一个整数而不是字符串,所以它返回int
,而不是char
或char*
.(调用printf
与从函数返回没有任何关系)
旧版本的C允许默认返回类型int
.
但是,最好明确指定返回类型.
在C(与C++不同)中,不带任何参数的函数声明为 int myFunc(void)
Joh*_*itb 12
以下内容在C89中有效
main() {
return 0;
}
Run Code Online (Sandbox Code Playgroud)
但是在现代C(C99)中,这是不允许的,因为你需要明确地告诉变量的类型和函数的返回类型,所以它变成了
int main() {
return 0;
}
Run Code Online (Sandbox Code Playgroud)
此外,省略return 0
现代C语是合法的,因此写作是合法的
int main() {
}
Run Code Online (Sandbox Code Playgroud)
行为就好像它返回0.
人们放在void
括号之间,因为它确保了函数调用的正确类型检查.C中的一组空括号表示没有关于参数的数量和类型的信息暴露在函数之外,并且调用者必须完全知道这些.
void f();
/* defined as void f(int a) { } later in a different unit */
int main() {
f("foo");
}
Run Code Online (Sandbox Code Playgroud)
调用f
导致未定义的行为,因为编译器无法f
根据其他模块中的预期验证参数的类型.如果你用void
或用它来编写int
,编译器就会知道
void f(int); /* only int arguments accepted! */
int main(void) {
f("foo"); /* 'char*' isn't 'int'! */
}
Run Code Online (Sandbox Code Playgroud)
因此,main
放在void
那里只是一个好习惯,因为在其他地方做这件事很好.在C中,您可以递归调用,main
在这种情况下,这种差异甚至可能很重要.
遗憾的是,只有少数编译器支持现代C,因此在许多C编译器上,您仍然可能会收到使用现代C功能的警告.
此外,您可能会看到要声明main
返回不同内容的程序int
.如果这些程序使用独立的 C实现,则可以这样做.这样的C实现不会施加任何限制,main
因为它们甚至不知道或者首先需要这样的功能.但是为了拥有程序入口点的通用和可移植接口,C规范要求严格符合程序以声明main与返回类型int
,并要求托管 C实现接受此类程序.