c++ - 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中,在任何严格遵守的模式下,调用前必须有作用域内函数的声明或定义。它仍然不必是原型(prototype)(推断的声明 int display(); 不是原型(prototype),定义也不是原型(prototype)——它需要是 int display (void) 提供原型(prototype)!)。

由于 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++ - C代码意外成功,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19969879/

相关文章:

c++ - SDL2 - 找不到 lsdlmain 和 lsdl。代码块

c - 无穷大和非数字的可移植检查

c++ - 仅使用纹理坐标的棋盘着色器

c++ - 二维数组问题

c - 修改linux内核后编译速度慢

android - 使用 Android.mk 加载共享库

c++ - 什么时候分配 block 作用域变量

python - Python 中的 C 函数 : Return an Array and Variables

c++ - 使用 boost::asio 的 HTTP POST 请求

c++ - 是否值得添加一个支持 move 的二传手?