我在Code :: Blocks v 12.11中测试以下代码:
#include <stdio.h>
int main()
{
display();
return 0;
}
void display()
{
printf("\nHi");
}
它编译成功并运行良好。我无法理解为什么? 我的查询如下:
在C / C ++中使用之前,至少需要声明一个函数或变量。在我们调用函数display()之前没有声明。
默认情况下,所有函数的返回类型都是int.So,我在这里期待编译错误,但是它成功完成。编译器会假设display()为int display()然后我们定义它作为void display()。
答案 0 :(得分:4)
在C ++中,必须在使用之前声明或定义函数;该代码不能是C ++。
在C89或预标准C中,如果编译器遇到一个后跟开括号的标识符,则它是一个函数调用,如果没有有效的声明或定义,则返回类型是隐式{{1}并且未指定参数的数量和类型。 (因此,在示例中,int
是一个函数,返回display()
并且获取无限期但不是可变数量的参数。)
在C99或C11中,在任何严格的合规模式下,您必须在调用之前在范围内具有该函数的声明或定义。它仍然不一定是原型(推断的声明int
不是原型,定义也不是原型 - 它需要int display();
来提供原型!)。
由于int display(void)
的推断类型和矛盾的定义,我相信你应该得到一个编译错误。即使在C89模式下,它最多也是一个允许它通过的草率编译器。实际上,我认为即使是预标准编译器也应该抱怨假定和实际返回类型之间的差异,但当然没有标准,所以你不能抱怨(而且,无论如何,这个标准现在已经24岁了 - 只支持古代的编译器。
您在哪个平台上使用哪个编译器(和版本)?
Mac OS X 10.9上的GCC 4.8.2,即使设置尽可能宽松,也说:
display()
答案 1 :(得分:-1)
您的代码作为.c文件运行良好,并在以.cpp文件形式执行时显示错误 我希望这篇文章解释原因。