以下已在 C89 中有效
main() {
return 0;
}
但是在现代 C (C99) 中,这不再被允许了,因为你需要明确地告诉变量的类型和函数的返回类型,所以它变成了
int main() {
return 0;
}
此外,在现代 C 中省略 thereturn 0
是合法的,所以写成是合法的
int main() {
}
行为就好像它返回了 0。
人们放在void
括号之间是因为它确保对函数调用进行正确的类型检查。C 中的一组空括号意味着没有关于参数的数量和类型的信息暴露在函数之外,调用者必须准确地知道这些。
void f();
/* defined as void f(int a) { } later in a different unit */
int main() {
f("foo");
}
调用会f
导致未定义的行为,因为编译器无法f
根据其他模块中的预期来验证参数的类型。如果你用void
或 with编写它int
,编译器会知道
void f(int); /* only int arguments accepted! */
int main(void) {
f("foo"); /* 'char*' isn't 'int'! */
}
因此,main
放在void
那里只是一个好习惯,因为在其他地方做也很好。在 C 中,您可以递归调用main
,在这种情况下,这种差异甚至可能很重要。
遗憾的是,只有少数编译器支持现代 C,因此在许多 C 编译器上,您可能仍然会收到使用现代 C 功能的警告。
此外,您可能会看到程序声明main
返回不同于int
. 如果此类程序使用独立的C 实现,则可以做到这一点。这样的 C 实现不会施加任何限制,main
因为它们甚至不知道或首先需要这样的函数。但是为了给程序的入口点提供一个通用且可移植的接口,C 规范要求严格遵守程序来声明 main 和返回类型int
,并要求托管的 C 实现接受这样的程序。