在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 :

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

无法明确表达出来。