C标准(ANSI [C89],C99,C11)中不允许嵌套函数(块作用域中的函数声明)。
但我无法在C标准中找到它。
编辑:
为什么函数定义不能在函数定义中(复合语句)?
答案 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程序员。嵌套函数本身并不是一个坏主意,但您可以通过编写静态文件范围函数来实现几乎所有好处,这是创建标准化的私有函数的方法。