主要有单一论点

时间:2012-06-29 13:22:04

标签: c c89

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

认为发生的事情是签名被忽略而且main被称为main(int,char**)无论如何,但我不确定。

在程序中看起来像这样: main(argc) { ... }

2 个答案:

答案 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实现中,当您将额外的参数传递给函数时,它们在大多数情况下都会被忽略。所以,除非你在一个重要的系统上,如果你溢出发送给函数的变量,你应该没问题。