gcc没有警告调用带有参数的nullary函数?

时间:2010-08-10 11:38:10

标签: c gcc

任何人都可以告诉我,为什么在大火中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

4 个答案:

答案 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);

此功能可以接受任意数量的参数。

但我明白你的观点。几乎没有任何编译器甚至会对它做出最轻微的警告。