我最近遇到了一个 C 程序,其中 main 函数只接受一个参数。这在 C89 中合法吗?gcc 似乎没有任何问题。
我认为发生的是签名被忽略并且 mainmain(int,char**)
无论如何都被调用,但我不确定。
在程序中是这样的:
main(argc) {
...
}
根据 C89 标准,这是不合法的。从第2.1.2.2 节托管环境:
程序启动时调用的函数名为 `main`。实施 没有声明这个函数的原型。它可以不带参数定义: int main(void) { /*...*/ } 或带有两个参数(此处称为 argc 和 argv ,尽管任何名称 可以使用,因为它们对于声明它们的函数是本地的): int main(int argc, char *argv[]) { /*...*/ }
C99 标准在第5.1.2.2.1 节程序启动中声明相同。
是的,它有效†</sup>,但它没用。
请记住,在 C 中,任何没有指定类型的变量都默认为int
,因此这意味着函数扩展为:
int main(int argc) {
...
}
这在 C89 中是合法的。然而,大多数时候,如果您想知道发送给程序的参数数量,您可能需要这些参数的内容,所以这几乎没有用。
但是,GCC(使用 编译时-Wall
)给了我一个警告:
'main' 声明中只有一个参数。
这只是说这段代码几乎没用。
但是,从技术上讲,正如@hmjd 指出的那样,这是非法的,因为它是未定义的行为。但是,在我遇到的大多数 C 实现中,当您将额外参数传递给函数时,它们大部分都被忽略了。因此,除非您在一个系统上,如果您溢出发送到函数的变量数量很重要,您应该没问题。