int main()有什么问题?

时间:2013-04-03 19:20:57

标签: c prototype main

我无法计算我在那里看过C代码的次数,在这里将 main 定义为

int main() { ...

当我用

编译它时
gcc -ansi -pedantic -Wstrict-prototypes -Werror foo.c

错误
foo.c:2: warning: function declaration isn't a prototype

为什么会这样?

int main(void)

需要让错误消失吗?

3 个答案:

答案 0 :(得分:7)

因为定义

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

不包括原型;它没有指定参数的数量或类型。

此:

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

确实包含原型。

使用空括号,您说main采用固定但未指定的数字和类型的参数。使用(void),您明确表示需要 no 参数。

对于前者,这样的呼叫如下:

main(42);

不一定会被诊断出来。

这可以追溯到在将原型引入语言之前的ANSI之前的日子,并且大多数函数都是用空括号定义的。那时候,写下来是完全合法的:

int foo();

int foo(n)
int n;
{
    /* ... */
}

...

foo(42);

当原型被添加到语言中时(借用C ++),有必要保留空括号的旧含义;添加了“new”(这是1989)语法(void),因此你可以明确地说一个函数不带参数。

(C ++有不同的规则;它不允许旧式非原型函数,空括号表示函数不带参数.C ++允许(void)语法与C兼容,但它不是一般建议。)

最佳做法是使用(void),因为它更明确。并不完全清楚int main()形式是否有效,但我从未见过不接受它的编译器。

答案 1 :(得分:2)

它没有错误 - 它警告。国旗说明了一切:它希望你关心main收到的论据(通常是int argc, char **argv)

答案 2 :(得分:1)

根据gcc documentation,当您添加-Wstrict-prototypes时,这是一个警告,因为:

  

-Wstrict-prototypes(仅限C和Objective-C)
  如果在未指定参数类型的情况下声明或定义函数,则发出警告。 (如果前面带有指定参数类型的声明,则允许使用旧式函数定义而不发出警告。)

但是对于你来说这是一个错误,因为-Werror

  

- 错误
  将所有警告变为错误。

一般来说,定义这样的main()是错误的(无论你在这里看到过什么),C规范定义了main()在5.1.2.2.1中的含义:

  

程序启动时调用的函数名为main。实施宣布否   这个功能的原型。它应该使用返回类型int和no来定义   参数:
  

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

  或者有两个参数(这里称为argc和argv,但任何名称都可以   使用,因为它们是声明它们的函数的本地):

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