我编译了以下程序而没有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数据类型?
答案 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 ++标准对此问题的看法:
[注意:如果使用函数或成员函数名称,并且名称查找未找到该名称的声明,则程序格式错误。这种调用没有隐式声明任何函数。 - 结束说明]
无法明确表达。