我最近遇到过一个C程序,其中main函数只接受一个参数。这在C89是合法的吗? gcc似乎没有任何问题。
我认为发生的事情是签名被忽略而且main被称为main(int,char**)
无论如何,但我不确定。
在程序中看起来像这样:
main(argc) {
...
}
答案 0 :(得分:5)
根据C89标准,这是不合法的。来自 2.1.2.2托管环境部分:
The function called at program startup is named `main`. The implementation declares no prototype for this function. It can be defined with no parameters: int main(void) { /*...*/ } or with two parameters (referred to here as argc and argv , though any names may be used, as they are local to the function in which they are declared): int main(int argc, char *argv[]) { /*...*/ }
C99标准在 5.1.2.2.1程序启动部分中说明相同。
答案 1 :(得分:3)
是的,它有效†,但没用。
请记住,在C中,任何没有指定类型的变量都默认为int
,这意味着该函数扩展为:
int main(int argc) {
...
}
这在C89中是合法的。但是,大多数情况下,如果你想知道发送给程序的参数数量,你可能想要这些参数的内容,所以这几乎是无用的。
但是,GCC(使用-Wall
编译时)会给我一个警告:
Only one parameter on 'main' declaration.
这只是说这段代码几乎没用。
但是,从技术上讲,正如@hmjd所说,这是 非法 ,因为它是未定义的行为。但是,在我遇到的大多数C实现中,当您将额外的参数传递给函数时,它们在大多数情况下都会被忽略。所以,除非你在一个重要的系统上,如果你溢出发送给函数的变量,你应该没问题。