我无法计算我在那里看过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)
需要让错误消失吗?
答案 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[]) { /* ... */ }