Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/unity3d/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么C中的嵌套函数不符合C标准_C_Standards - Fatal编程技术网

为什么C中的嵌套函数不符合C标准

为什么C中的嵌套函数不符合C标准,c,standards,C,Standards,C标准(ANSI[C89]、C99、C11)中不允许使用嵌套函数(块范围中的函数声明) 但是我在C标准中找不到它 编辑: 为什么函数定义不能包含在函数定义(复合语句)中?嵌套函数或私有函数是许多C编译器过去允许的,但不是C标准的一部分,现在很难找到支持它们的编译器,当然是默认情况下 标准是由一个委员会决定的,嵌套函数将是他们讨论过的东西,并且会有一个基本原理,但我不知道它是什么,大多数C程序员也不知道。嵌套函数本身并不是一个坏主意,但您可以通过编写静态文件作用域函数来实现几乎所有的好处,这是一种

C标准(ANSI[C89]、C99、C11)中不允许使用嵌套函数(块范围中的函数声明)

但是我在C标准中找不到它

编辑:


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

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


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

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


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

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

int f(void) { /* ... */ } // function definition
int f(void);              // function declaration
在6.9.1中,函数的语法定义为

功能定义: 声明说明符声明器声明listopt复合语句

在6.8.2中,可以放在复合语句中的内容定义为声明或语句。函数定义在语法上不被认为是这两种定义之一

是的,函数声明在函数中是合法的,但函数定义不是

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

    // blah blah
}

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

int f(void) { /* ... */ } // function definition
int f(void);              // function declaration
在6.9.1中,函数的语法定义为

功能定义: 声明说明符声明器声明listopt复合语句

在6.8.2中,可以放在复合语句中的内容定义为声明或语句。函数定义在语法上不被认为是这两种定义之一

是的,函数声明在函数中是合法的,但函数定义不是

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

    // blah blah
}

它可能不会直接说明,但如果您仔细阅读函数定义语法,您会发现它们在语法中不被接受

为什么??丹尼斯·里奇(Dennis Richie)认为,他们似乎从一开始就被排除在外:

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

通过施加更严厉的限制来避免限制是一种幽默。我认为这是一个简化的策略。嵌套过程增加了编译器的复杂性(里奇非常热衷于限制当时的机器),并且没有增加多少价值

标准化过程(明智地)从未被视为随意扩展C的机会,并且(来自同一文档):

“从一开始,X3J11委员会就对语言扩展持谨慎、保守的观点。”

很难证明嵌套函数提供了显著的好处,因此,即使某些实现支持它们,它们也没有被作为标准采用,这也就不足为奇了

一般来说,此后的标准工作至少同样保守,而且很难看到实现者对添加这样一个特性的大量支持


在一天结束时,如果您担心某些函数的使用超出其预期目的,并且(逻辑上)是一个给定函数的子函数,那么就给它静态链接,并引入另一个源文件,甚至整个翻译单元

可能没有直接说明,但如果你仔细阅读函数定义语法,你会发现它们在语法中不被接受

为什么??丹尼斯·里奇(Dennis Richie)认为,他们似乎从一开始就被排除在外:

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

通过施加更严厉的限制来避免限制是一种幽默。我认为这是一个简化的策略。嵌套过程增加了编译器的复杂性(里奇非常热衷于限制当时的机器),并且没有增加多少价值

标准化过程(明智地)从未被视为随意扩展C的机会,并且(来自同一文档):

“从一开始,X3J11委员会就对语言扩展持谨慎、保守的观点。”

很难证明嵌套函数提供了显著的好处,因此,即使某些实现支持它们,它们也没有被作为标准采用,这也就不足为奇了

一般来说,此后的标准工作至少同样保守,而且很难看到实现者对添加这样一个特性的大量支持

在一天结束时,如果您担心某个函数的使用超出其预期目的,并且(逻辑上)是某个给定函数的子函数