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

时间:2017-03-15 08:17:54

标签: 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);
}

但是,我编译了以下程序而没有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数据类型?

4 个答案:

答案 0 :(得分:3)

嗯,它和C一样多,就像C ++一样。

考虑到问题是基于 &#34;假设&#34; ,从C编译器的角度来看代码是有效的,让我详细说明,根据规范(C11),不允许隐式声明函数。使用严格的一致性编译代码,并且(任何符合标准的)编译器将在C中产生相同的错误。

See live example

引用C11,前言/第7页,&#34;第二版中的主要更改包括:&#34;

  
      
  • 删除隐式函数声明
  •   

并且同样存在于C99中。

注意:关于它可能有效的原因

Pre C99,实际上有成功编译此代码的空间。如果缺少函数原型,则假定函数返回int并接受任意数量的参数作为输入。现在非常非标准,具有遗留支持的编译器可能会选择允许编译这样的代码,但严格来说,符合标准的编译器应该拒绝这样做。

答案 1 :(得分:2)

  

为什么C ++编译器会出错?

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

  

默认情况下是否采用int数据类型?

没有。过去曾经是另一种语言C的情况。在C ++中并非如此(在后来的标准版本中也不是C语言。)

答案 2 :(得分:1)

在C ++中,您无法调用未声明的函数。在C中,如果函数的定义返回int,则可以在没有前向声明符的情况下调用函数。这是因为旧的K&amp; R功能定义风格。对于ANSI-C来说这已经过时了,总是用原型声明一个函数。

答案 3 :(得分:1)

通过Sourav Ghosh完成图片并与答案相关。以下是C ++标准对此问题的看法:

[expr.call] p2

  

[注意:如果使用函数或成员函数名称,并且名称查找未找到该名称的声明,则程序格式错误。这种调用没有隐式声明任何函数。 - 结束说明]

无法明确表达。