在C ++中缺少前向声明的问题
我已经编译了以下程序而没有在C
前向声明函数。 它已成功编译并在GCC
运行,没有任何警告或错误。
#include int main() { int ret = func(10, 5); } int func(int i, int j) { return (i+j); }
但是,我编译了以下程序而没有在C++
正向声明函数,编译器给了我一个错误。
#include 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编译器的角度来看是有效的,让我详细说明,根据规范( C11
),不允许隐式声明函数。 使用严格的一致性编译代码并且(任何符合标准的)编译器将在C中产生相同的错误。
查看实例
引用C11
,前言/第7页, “第二版的主要变化包括:”
- 删除隐式函数声明
同样存在于C99
。
注意: 为什么它可能有效
在C99
,这个代码实际上有成功编译的空间。 如果缺少函数原型,则假定函数返回一个int
并接受任意数量的参数作为输入。 现在非常非标准,具有遗留支持的编译器可能会选择允许编译这样的代码,但严格来说,符合标准的编译器应该拒绝这样做。
为什么C ++编译器会出错?
因为您不应该调用尚未在C ++中声明的函数。
是不是默认采用int数据类型?
不。以前是另一种语言的情况,C。在C ++中不是这种情况(从后来的标准版本也不是C)。
在C ++中,您无法调用未声明的函数。 在C中,如果函数的定义返回int,则可以在没有前向声明符的情况下调用函数。 这是因为旧的K&Rfunction定义风格。 这对于ANSI-C来说已经过时,总是用原型声明一个函数。
完成图片并与Sourav Ghosh的答案相关。 以下是C ++标准对此问题的看法:
[expr.call] p2 :
[注意:如果使用函数或成员函数名称,并且名称查找未找到该名称的声明,则程序格式错误。 这样的调用没有隐式声明任何函数。 – 结束说明]
无法明确表达出来。