另一个函数内的函数声明是否有用?

时间:2018-01-22 16:11:33

标签: c function

我正在读这个与我有关的question,即使相关的问题是在C中询问为什么这样的构造是可能的,但答案并没有解决这个问题,并讨论了其他一些问题。
我不明白在另一个函数中有一个函数声明有什么好处,我甚至无法想象一个它真正有用的场景。
我想看一个例子,其中内部声明可以带来外部不能的东西,或者至少是一个更好,更有用或更清洁的场景。

2 个答案:

答案 0 :(得分:4)

  

我不明白拥有一个功能有什么好处   在另一个函数中声明,我甚至无法想象一个   它非常有用的场景。

标准及其使用者(我们)有一个好处:标准​​可以更简单地表达声明的语法和语义,而不会产生特殊的例外。关键不在于在块范围内声明一个函数有任何特别的好处,但这样做几乎无害,并允许它使语言更加一致。

然而,在块范围内声明函数是不好的风格。这使得您的代码难以维护,因为如果函数签名发生更改,那么您需要在整个地方查找和修复事件。这就是为什么它只是主要无害。

您链接的问题的一个答案认为,块范围函数声明用于保持全局命名空间更清晰,但事实并非如此。虽然仅在块作用域声明一个函数确实意味着声明在该块之外是不可见的,但在程序中的任何地方仍然不能有多个该函数的外部定义。对该名称的外部函数的所有引用都引用该函数,因此它占据全局名称空间中的一个槽,无论其标识符是否在任何特定转换单元的范围内。

  

我想看一个例子   内部声明可以带来外面的东西,或者在   至少,这是一个更好,更有用或更清洁的场景。

没有这样的例子。在文件范围声明函数总是更好,更清晰。此外,具有外部链接的函数应在头文件中声明,并将这些头#include d转换为引用或定义函数的转换单元。

<强>更新 正如您在本答案的注释中所看到的,可以推测块范围声明将允许从声明相同标识符的转换单元调用外部函数,并使用内部链接,引用别的东西。只有在标识符的任何文件范围声明之前的块内部使用外部链接声明标识符,并且稍后在文件范围内使用内部链接声明时,此类方案才有效。但是这种情况是不允许的:在任何给定的整个翻译单元中,不能用内部和外部链接声明相同的标识符。

答案 1 :(得分:3)

你是对的。在另一个函数中声明一个函数永远不会有用,因为函数总是在外部链接,与可能具有自动存储持续时间和块范围的变量不同。

由于可执行二进制文件的布局,一个函数总是可以从同一个二进制文件中的另一个函数访问,因此在另一个函数中声明它是没有意义的,或者更确切地说,具有有限范围的函数。