C语言 另一个函数中的函数声明有用吗?



我正在阅读这个问题,这与我的问题有关,尽管链接的问题是在问为什么这种结构在 C 中是可能的,但答案并没有解决这个问题并讨论了其他一些问题。
我不明白在另一个函数中使用函数声明有什么好处,我什至无法想象它真正有用的场景。
我想看到一个例子,其中内部声明可以带来外部不能带来的东西,或者至少是一个更好,更有用或更干净的场景。

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

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

然而,在块范围内声明函数是一种糟糕的风格。 这使得您的代码更难维护,因为如果函数签名发生变化,那么您需要查找并修复所有地方的实例。 这就是为什么它只是大部分无害的。

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

我想看一个例子 内部声明可以带来外部不能带来的东西,或者在 至少,一个更好、更有用或更干净的场景。

没有这样的例子。 在文件范围内声明函数总是更好、更干净。 此外,具有外部链接的函数应在头文件中声明,这些头文件#included 到引用或定义函数的翻译单元中。

更新:正如你在这个答案的评论中看到的,人们可以推测,块范围的声明将允许从翻译单元调用外部函数,在该翻译单元中,声明了相同的标识符,并带有内部链接,以引用其他内容。 只有当标识符在标识符的任何文件范围声明之前使用外部链接声明,并在文件范围之后使用内部链接声明时,这种方案才能起作用。 但这种情况是不允许的:在任何给定的整个翻译单元中,不能同时声明具有内部和外部链接的相同标识符。

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

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

最新更新