为什么C中的嵌套函数是针对C标准的

时间:2017-04-24 09:20:28

标签: c standards

C标准(ANSI [C89],C99,C11)中不允许嵌套函数(块作用域中的函数声明)。

但我无法在C标准中找到它。

编辑:

为什么函数定义不能在函数定义中(复合语句)?

3 个答案:

答案 0 :(得分:5)

函数声明与函数定义之间存在差异。声明仅声明函数的存在,定义定义函数。

int f(void) { /* ... */ } // function definition
int f(void);              // function declaration

在6.9.1中,函数的语法定义为

函数的定义:         declaration-specifiers声明符声明列表 opt compound-statment

在6.8.2中,您可以将复合语句中的内容定义为声明语句。函数定义不被认为是这些语法中的任何一个。

所以是的,函数声明在函数中是合法的,但函数定义不是例如。

int main(int argc, char*argv[])
{
    int f(void);                // legal
    int g(void) { return 1; } ; // ILLEGAL

    // blah blah
}

答案 1 :(得分:0)

可能没有直接说明,但如果你通过语法进行功能定义,你会发现它们在语法中不被接受。

为什么呢?根据Dennis Richie(他对此事有点权威)的说法,他们似乎从一开始就被排除在外:

"程序可以嵌套在BCPL中,但可能不会引用包含过程中定义的非静态对象。 B和C通过施加更严格的限制来避免这种限制:根本没有嵌套程序。"

https://www.bell-labs.com/usr/dmr/www/chist.html

通过施加更严厉的限制来避免限制,这是一种幽默。我读到这是一个简化的策略。嵌套过程增加了编译器的复杂性(Ritchie非常希望限制机器的时间)并且几乎没有增加价值。

标准化过程(明智地)从来没有被视为一个机会来扩展C willy-nilly和(来自同一文档):

"从一开始,X3J11委员会就语言扩展采取谨慎,保守的观点。"

很难说嵌套函数提供了显着的好处,因此即使某些实现支持它们也不会被视为标准,这并不奇怪。

总的来说,从那以后,标准的努力至少同样保守,而且在实施者中很难看到很多人支持添加这样的功能。

如果您担心某些功能在其预期目的之外使用并且(逻辑上)只是一个给定功能的子功能,那么在一天结束时,给它静态链接并引入另一个源文件或甚至整个翻译单位。

答案 2 :(得分:-1)

嵌套或私有函数是许多C编译器过去允许的,但不是C标准的一部分,现在很难找到支持它们的编译器,当然默认情况下。

标准由一个委员会决定,嵌套函数将是他们讨论过的东西,并且会有一个基本原理,但我不知道它是什么,也不是大多数C程序员。嵌套函数本身并不是一个坏主意,但您可以通过编写静态文件范围函数来实现几乎所有好处,这是创建标准化的私有函数的方法。