0

我正在 Code::Blocks v 12.11 中测试以下代码:

#include <stdio.h>

int main()
{
    display();
    return 0;
}

void display()
{
    printf("\nHi");
}

它编译成功并且运行良好。我无法理解为什么?我的查询如下:

  1. 在 C/C++ 中使用之前,至少需要声明一个函数或变量。在这里,在我们调用函数 display() 之前没有声明。

  2. 默认情况下,所有函数的返回类型都是 int。所以,我预计这里会出现编译错误,但它成功通过。编译器会假定 display() 为 int display(),然后我们将其定义为 void display() .

4

2 回答 2

4

在 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();
     ^
于 2013-11-14T05:02:47.450 回答
-1

您的代码作为 .c 文件运行良好,并且在作为 .cpp 文件执行时显示错误我希望这篇文章能解释原因。

为什么函数声明在 C++ 中是强制性的,而不是在 C 中?

于 2013-11-14T13:29:21.133 回答