【问题标题】:C++: Why does function declaration is allowed inside another function but not function definition?C ++:为什么在另一个函数中允许函数声明而不是函数定义?
【发布时间】:2019-01-20 06:32:41
【问题描述】:

我查看了以下问题以检查是否可以在函数中定义函数。

Can we have functions inside functions?

接受的答案是“否”。我试了一下,结果是一样的。

但是当我尝试编译下面的代码(仅声明)时,它确实编译了。 我不太确定为什么允许这样做。

#include <iostream>
using namespace std;

int main(int argc, char* argv[])
{
    int a, *b, f(int c); //trying out multiple name declaration
    int f(int c);
}

【问题讨论】:

  • 底线 - 它是允许的,因为 C++ 标准说它是。此外,在现代 C++ 中,您可以在其他函数中以 lambda 的形式定义函数。
  • @NeilButterworth,是的,我同意,但必须有某种应用程序。我只是想知道。
  • @pasha 不,给定的语法怪癖不一定有任何用处。这可能只是无害的废话。
  • 这是一个前向声明。
  • @dan 前向声明 什么?我从来没有听过人们对函数说前向声明

标签: c++ function function-declaration function-definition


【解决方案1】:

C++:为什么函数声明允许在另一个函数中,但不允许函数定义?

因为标准是这样说的(或者没有明确禁止它)。旁注:同样适用于块范围内的全局变量声明。

您可能会问,为什么标准委员会不禁止它。并非标准的每条规则的所有基本原理,尤其是缺乏假设规则,都被记录在案,但我可以在这种情况下进行推测。

必须理解的是,C++ 最初是基于 C 语言构建的,在标准化时与 C 的兼容性是高度优先考虑的(我相信现在仍然如此)。所以,我很有信心地说函数(和全局变量)声明在 C++ 的块范围内是允许的,因为它们在 C 中是允许的。

为什么在 C 中允许函数声明,你可能也会问。据我所知,在现代 C 中,块作用域函数声明的使用已经下降,这是标准化前的遗留物。我们大概可以将语言传承延续到B语言。我自己对 B 了解不多,但 example code in wikipedia 恰好有一个块作用域函数声明。

【讨论】:

  • 我对标准的看法是,“如果允许,那就有它的理由。”所以,我想知道它。如果您说标准中存在过去的随机事物,那对我来说是新事物。
  • 向后兼容是一个原因。
  • 有道理。但肯定有人说过,“男孩,我们为什么要支持 C++17 的 B 语言内容”。
  • @pasha 我认为人们不会通过语言规则来思考他们有多少历史,并决定如果他们老了就应该做些什么。 C++ 与 B 仍有很多的共同点。
猜你喜欢
  • 1970-01-01
  • 2012-10-28
  • 2015-09-28
  • 2015-07-10
  • 1970-01-01
  • 2016-05-14
  • 1970-01-01
  • 2019-10-27
  • 2010-10-10
相关资源
最近更新 更多