C++ C+中缺少远期申报的问题+;

C++ C+中缺少远期申报的问题+;,c++,c,forward-declaration,function-prototypes,C++,C,Forward Declaration,Function Prototypes,我在C中编译了以下程序,但没有向前声明函数。它已成功编译并在GCC中运行,没有任何警告或错误 #include <stdio.h> 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(1

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

#include <stdio.h>

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数据类型吗?< <强> > /p> < p>,它与C++中的错误一样多。 考虑到这个问题是基于“假设”的,即从C编译器的角度来看代码是有效的,让我详细说明一下,根据规范(
C11
),不允许隐式声明函数。用严格一致性编译代码,(任何一致性的)编译器都会在C中产生同样的错误

引用第11章前言第7页“第二版的主要变化包括:

  • 删除隐式函数声明
同样的情况也存在于
C99


注意:关于为什么它可能会起作用

在C99之前,这段代码实际上有成功编译的空间。在缺少函数原型的情况下,假设函数返回一个
int
,并接受任意数量的参数作为输入。这在很大程度上是非标准的,具有遗留支持的编译器可能会选择允许编译此类代码,但严格来说,合格的编译器应该拒绝这样做

为什么C++编译器会出错?< /P>

因为您不调用C++中未声明的函数。< /P> 默认情况下不是采用int数据类型吗


不。在另一种语言中,它是这样的情况。C是C++中的情况(也不是C,因为后来的标准版本)。C++中的

< P>不能调用未声明的函数。在C语言中,如果函数的定义返回int,则可以在不使用前向声明符的情况下调用函数。这是因为旧的K&R函数定义样式。这对于ANSI-C来说是过时的,请始终声明一个带有原型的函数。

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

:

[ 注意:如果使用函数或成员函数名,且名称查找未找到该名称的声明,则程序格式错误。此类调用不会隐式声明任何函数。 — 尾注 ]


不能比C++更明确。

从C++开始,C不再是“99”为什么“C++编译器给出错误”?因为标准是这样说的。@克雷格杨把它读成“没有FWD DECL…”是问题标题,只是抱怨C++在使用函数之前需要声明,因此在某些情况下需要。“向前声明”?@ SavavGHOS-讽刺的是,现代C和C++在这点上达成一致:这是一个正确的错误,而且大部分是错误的。当遇到未声明的函数时,C编译器假定声明(链接器将在没有找到实现的情况下抱怨)。当假设为false时,即当代码中稍后发现声明或实现时,如果声明或实现与假设不匹配,则会出现编译器错误。这可能会进一步受到编译器版本和编译器标志的影响。到目前为止,最好的建议是:不要这样做;始终提前声明。@parvus,是的,C编译器假设一个declaration。这是旧K&R C函数样式的遗留,其中函数声明器没有参数,如果函数返回int,则声明可能已被忽略。符合C99或更高版本的编译器将拒绝该代码。早于1999年或处于“C89”模式的编译器(例如,
gcc-stdc89
),通常不要求遵守C99。@Peter有时您需要使用选项强制执行“遵守”,默认情况下它不存在……这就是我要说的。
fl.cpp:6:22: error: ‘func’ was not declared in this scope
  int ret = func(10, 5);
                      ^