C++ 中缺少前向声明的问题

Issue with missing forward declaration in C++

我在 C 中编译了以下没有前向声明函数的程序。它已成功编译并在 GCC 中 运行,没有任何警告或错误。

#include <stdio.h>

int main()
{
        int ret = func(10, 5);
}

int func(int i, int j)
{
        return (i+j);
}

但是,我在 C++ 中编译了以下没有前向声明函数的程序,编译器给我一个错误。

#include <iostream>
using namespace std;

int main()
{
        int ret = func(10, 5);
}

int func(int i, int j)
{
        return (i+j);
}

错误:

fl.cpp:6:22: error: ‘func’ was not declared in this scope
  int ret = func(10, 5);
                      ^

为什么C++编译报错?不是默认取int数据类型吗?

嗯,在 C 中和在 C++ 中一样错误。

考虑到问题是基于 "assumption" 从 C 编译器的角度来看代码是有效的,让我详细说明一下,根据规范 (C11),函数的隐式声明是不允许的。以严格的一致性编译您的代码,(任何符合的)编译器将在 C 中产生相同的错误。

See live example

引用 C11、Foreword/p7、"Major changes in the second edition included:"

  • remove implicit function declaration

同样存在于C99,也。


注意:关于它可能起作用的原因

Pre C99,居然有空间让这段代码编译成功。在缺少函数原型的情况下,假定函数 returns 是 int 并接受任意数量的参数作为输入。现在这是非常不标准的,具有遗留支持的编译器可能会选择允许编译此类代码,但严格来说,符合规范的编译器应该拒绝这样做。

Why C++ Compiler Gives an Error?

因为您不能调用未在 C++ 中声明的函数。

Is it not by default take int data type?

没有。在另一种语言 C 中曾经是这种情况。在 C++ 中不是这种情况(自后来的标准版本以来在 C 中也不是)。

在 C++ 中,您不能调用未声明的函数。在 C 中,如果函数的定义 returns 是一个 int,则可以在没有前向声明符的情况下调用函数。这是因为旧的 K&R 函数定义样式。这对于 ANSI-C 已过时,始终声明具有原型的函数。

完成图片并与的答案相关。以下是 C++ 标准对这个问题的看法:

[expr.call] p2:

[ Note: If a function or member function name is used, and name lookup does not find a declaration of that name, the program is ill-formed. No function is implicitly declared by such a call.  — end note ]

没有比这更明确的了。