3

我最近遇到了一个 C 程序,其中 main 函数只接受一个参数。这在 C89 中合法吗?gcc 似乎没有任何问题。

认为发生的是签名被忽略并且 mainmain(int,char**)无论如何都被调用,但我不确定。

在程序中是这样的: main(argc) { ... }

4

2 回答 2

5

根据 C89 标准,这是不合法的。从第2.1.2.2 节托管环境

程序启动时调用的函数名为 `main`。实施
没有声明这个函数的原型。它可以不带参数定义:

    int main(void) { /*...*/ }

或带有两个参数(此处称为 argc 和 argv ,尽管任何名称
可以使用,因为它们对于声明它们的函数是本地的):

    int main(int argc, char *argv[]) { /*...*/ }

C99 标准在第5.1.2.2.1 节程序启动中声明相同。

于 2012-06-29T13:30:23.570 回答
3

是的,它有效†</sup>,但它没用。

请记住,在 C 中,任何没有指定类型的变量都默认为int,因此这意味着函数扩展为:

int main(int argc) {
    ...
}

这在 C89 中是合法的。然而,大多数时候,如果您想知道发送给程序的参数数量,您可能需要这些参数的内容,所以这几乎没有用。

但是,GCC(使用 编译时-Wall)给了我一个警告:

'main' 声明中只有一个参数。

这只是说这段代码几乎没用。

但是,从技术上讲,正如@hmjd 指出的那样,这是非法的,因为它是未定义的行为。但是,在我遇到的大多数 C 实现中,当您将额外参数传递给函数时,它们大部分都被忽略了。因此,除非您在一个系统上,如果您溢出发送到函数的变量数量很重要,您应该没问题。

于 2012-06-29T13:29:00.510 回答