在 C++ 中,函数必须在使用前声明或定义;该代码不能是 C++。
在 C89 或准标准 C 中,如果编译器遇到一个标识符后跟一个左括号,则它是一个函数调用,如果没有有效的声明或定义,则返回类型是隐式int
的,并且它的数量和类型参数未指定。(因此,在这个例子中,display()
是一个函数返回一个int
并接受一个不确定的——但不是可变的——参数数量。)
在 C99 或 C11 中,在任何严格遵从模式下,您必须在调用之前在范围内声明或定义函数。它仍然不必是原型(推断的声明int display();
不是原型,定义也不是原型——它需要int display(void)
提供原型!)。
由于推断的类型display()
和矛盾的定义,我相信你应该得到一个编译错误。即使在 C89 模式下,它充其量只是一个允许它通过的草率编译器。确实,我认为即使是预标准编译器也应该抱怨假定返回类型和实际返回类型之间的差异,但是当然没有标准,所以你不能抱怨(而且,无论如何,该标准现在已经 24 岁了— 仅支持接近过时的编译器)。
您在哪个平台上使用哪个编译器(和版本)?
Mac OS X 10.9 上的 GCC 4.8.2,即使设置尽可能宽松,说:
dec.c:9:6: warning: conflicting types for ‘display’ [enabled by default]
void display()
^
dec.c:5:5: note: previous implicit declaration of ‘display’ was here
display();
^