C中的嵌套函数

Sac*_*iya 84 c nested function

我们可以在C中使用嵌套函数吗?嵌套函数有什么用?如果它们存在于C中,它们的实现是否因编译器而异?

嵌套函数是否允许使用任何其他语言?如果是,那么它们的意义何在?

Jam*_*lis 97

您无法在标准C中的另一个函数中定义函数.

您可以在函数内声明函数,但它不是嵌套函数.

gcc具有允许嵌套函数的语言扩展.它们是非标准的,因此完全依赖于编译器.


Mar*_*tos 33

不,他们不存在于C.

它们在Pascal等语言中使用(至少)有两个原因:

  1. 它们允许功能分解而不会污染命名空间.您可以通过依赖一个或多个嵌套函数将问题分解为更小的逻辑片段来定义单个公开可见的函数,该函数实现一些复杂的逻辑.
  2. 它们在某些情况下简化了参数传递.嵌套函数可以访问外部函数范围内的所有参数和部分或全部变量,因此外部函数不必显式地将一堆本地状态传递给嵌套函数.


zol*_*i2k 18

嵌套函数不是ANSI C的一部分,但它们是 Gnu C的一部分.

  • GCC支持的其他语言确实有它们(我知道ADA和Pascal),所以它很可能很容易添加到C实现中,或者它被添加到C中以便为支持语言做准备要求他们. (3认同)
  • @Sachin帮助实现为什么可以使用gcc编译具有嵌套函数的C代码.该信息具有教育价值.此外,如果仅限于C89,C99或GNU C,则不会指出该问题 (2认同)

CB *_*ley 15

不,你不能拥有嵌套功能C.最接近的是在另一个函数的定义中声明一个函数.但是,该函数的定义必须出现在任何其他函数体之外.

例如

void f(void)
{
    // Declare a function called g
    void g(void);

    // Call g
    g();
}

// Definition of g
void g(void)
{
}
Run Code Online (Sandbox Code Playgroud)

  • 如果以这种方式声明函数g,那么它的范围是什么? (5认同)
  • 声明的范围与任何其他声明一样,因此在这种情况下直到函数结束.当然,一旦"g"的定义在文件中稍后可见,那么声明就在其余翻译单元的范围内.此外,即使不可取,您也可以在C中调用函数而不在范围内显示可见声明. (5认同)

小智 5

我提到这一点是因为许多用C进行编码的人现在都在使用C ++编译器(例如Visual C ++和Keil uVision)来执行此操作,因此您可以使用此功能...

尽管尚未在C中允许,但是如果您使用的是C ++,则可以使用C ++ 11中引入的lambda函数达到相同的效果:

void f()
{
    auto g = [] () { /* Some functionality */ }

    g();
}
Run Code Online (Sandbox Code Playgroud)

  • @Virgile-这个问题还明确指出“嵌套函数是否允许使用任何其他语言?”。乔恩的回答对我有所帮助。 (11认同)
  • 这个问题专门针对C,而不是C ++ (2认同)