任何人都可以告诉我,为什么在大火中GCC(例如4.4.3)没有警告或错误的错误调用Nullary函数?
void hello() {
}
int main( int argc, char* argv[] ) {
int test = 1234;
hello(test);
return 0;
}
(另见http://bytes.com/topic/c/answers/893146-gcc-doesnt-warn-about-calling-nullary-function-parameters)
答案 0 :(得分:12)
由于:
void hello() {
并不代表你的想法。使用:
void hello( void ) {
没有虚空,你说你不能打扰指定参数。请注意,这是C与C ++不同的众多方式之一。
答案 1 :(得分:11)
在C中,void hello()
声明了一个函数hello()
,它返回void
并取unspecified number of arguments.
注意强>
在C ++中,它们是一个不同的场景。 C ++中的void hello()
声明了一个函数hello()
,它返回void
并取no arguments.
答案 2 :(得分:4)
从我可以从The C Book 4.2收集的内容,您的函数定义不是原型,因为它没有为参数指定类型信息。这意味着编译器只记住返回类型,并且不保留任何关于参数的信息。
这种形式的定义仍然允许向后兼容,并且不限于不带参数的函数。 gcc同样会允许像
这样的东西void hello( a ) {
}
int main( int argc, char* argv[] ) {
int test = 1234;
hello(test,1);
return 0;
}
这里只缺少重要的参数类型信息。要解决此问题并确保gcc在使用函数时检查参数,您可以将类型信息放在函数声明或定义中。你最好把它们放在两者中。
所有这些仍然没有真正回答你的问题,为什么gcc没有警告你。必须是gcc团队认为仍有足够的旧式C代码来证明默认情况下抑制警告的情况。 IMO我很惊讶@caf提到的-Wstrict-prototype
选项默认不启用。
答案 3 :(得分:1)
您的定义必须是:
void hello(void);
此功能可以接受任意数量的参数。
但我明白你的观点。几乎没有任何编译器甚至会对它做出最轻微的警告。