2

我在某处读到 C 中允许嵌套函数(至少 GNU 编译器允许它)。考虑以下代码:

/* nestedfunc.c */
#include <stdlib.h> /* for atoi(3) */
#include <stdio.h>

int F (int q)
{
  int G (int r)
  {
    return (q + r);
  }
  return (G (5));
}

int main (int argc, const char* argv[])
{
  int q = 0;
  if (argc > 1)
  {
    q = atoi (argv[1]);
  }

  printf ("%d\n", F (q));
  return 0;
}

编译和运行:

gcc -o nestedfunc -O2 -s -Wall nestedfunc.c
me@mybox:~/college/c++/other stuff$ ./nestedfunc 8
13
me@mybox:~/college/c++/other stuff$

我还读到其他一些编程语言支持这些。我的问题是:嵌套函数有什么有用的用途?提前致谢。

4

4 回答 4

3

嵌套函数可以访问外部函数的局部变量。有点像闭包,您可以获取一个指向嵌套函数的指针并将这个指针传递给其他函数,并且嵌套函数将可以访问当前调用的局部变量(如果此调用已经返回,则会发生坏事)。因为 C 运行时系统不是为此而设计的,所以函数指针通常只是指向函数第一条指令的指针,而指向嵌套函数的指针只能通过在堆栈上编写一些代码并将指针传递给它来完成。从安全的角度来看,这是一个坏主意。

如果要使用嵌套函数,请使用具有适当支持它们的运行时系统的语言。为了在 C 中实现类似的结果,请将“外部函数的局部变量”放入上下文结构中并手动传递。

于 2010-11-27T21:34:51.250 回答
2

嵌套函数通过词法作用域提供封装

在您的示例中,G()只能F()F().

于 2010-11-27T21:16:55.300 回答
1

一般来说,嵌套函数通常是一个辅助函数,它只在另一个函数内部使用。它有点像一个static函数(具有文件范围),但更加本地化(只有函数范围)。

嵌套函数不是标准的 C 语言,因此没有理由在该语言中使用它们。

于 2010-11-27T21:19:02.107 回答
0

在其他编程语言(例如 Python、Ruby)中,函数是第一类对象。你有闭包,这是一个强大的抽象概念。在python中你可以这样做:

def curry(func):
    from inspect import getfullargspec
    args = getfullargspec(func)
    num_args = len(args[0])

    def new_func(list_args, *args):
        l = len(list_args) + len(args)
        nl = list_args + list(args)
        if l > num_args:
             raise TypeError("Too many arguments to function")
        elif l == num_args:
             return func(*nl)
        else:
             return lambda *new_args: new_func(nl, *new_args)

    return lambda *args: new_func([], *args)

那是咖喱装饰器,它接受一个功能并使其咖喱。

于 2010-11-27T21:21:43.073 回答