C 代码的意外成功

  • 本文关键字:成功 意外 代码 c++ c
  • 更新时间 :
  • 英文 :


我正在 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()。

在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();
     ^

您的代码可以很好地用作 .c 文件,并在作为.cpp文件执行时显示错误我希望这篇文章能解释为什么。

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

最新更新