C中的嵌套函数


93

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



Answers:



36

不,它们在C中不存在。

之所以在Pascal之类的语言中使用它们,至少有两个原因:

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

21

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


有什么意义,如果他们是GNU C的一部分
萨钦Chourasiya

4
@Sachin帮助了解为什么可以使用gcc编译具有嵌套函数的C代码。该信息具有教育价值。而且,问题是否只限于C89,C99或GNU C,也未指定问题
zoli2k,2010年

4
GCC支持的其他语言也有它们(我知道的ADA和Pascal),因此很可能很容易将其添加到C实现中或将其添加到C中以准备支持以下语言:要求他们。
nategoose 2010年

MATLAB还具有嵌套函数。
mikeTronix '16

17

不,您不能在中使用嵌套函数C。最接近的是在另一个函数的定义内声明一个函数。但是,该函数的定义必须出现在任何其他函数主体之外。

例如

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

    // Call g
    g();
}

// Definition of g
void g(void)
{
}

6
如果以这种方式声明函数g,那么它的范围是什么?
Sachin Chourasiya

6
该声明的作用域与其他任何声明一样,因此在这种情况下直到函数结束。当然,一旦g在文件中稍后看到的定义,该声明就在翻译单元其余部分的范围之内。另外,即使不建议在范围中没有可见的声明,也可以在C中调用函数。
CB Bailey 2010年

5

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

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

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

    g();
}

4
这个问题专门针对C,而不是C ++
Virgile 2014年

11
@Virgile-这个问题还明确指出“嵌套函数是否允许使用其他任何语言?”。乔恩的回答对我有所帮助。
www-0av-Com 2015年

3

正如其他人回答的那样,标准C不支持嵌套函数。

嵌套函数在某些语言中用于将多个函数和变量封装到一个容器(外部函数)中,以便从外部看不到单个函数(外部函数除外)和变量。

C中,可以通过将此类函数放在单独的源文件中来完成此操作。将main函数定义为global,并将所有其他函数和变量定义为static。现在,只有主要功能在此模块外部可见。


如果存在递归outer-> nested-> outer-> nested,那么将存在两个不同的框架int declared_in_outer,因此您不能仅将其declared_in_outer作为静态全局变量。
Adrian Panasiuk

1

为了回答您的第二个问题,有些语言允许定义嵌套函数(可以在此处找到列表:nested-functions-language-list-wikipedia)。

在JavaScript(这是最著名的语言之一)中,嵌套函数(称为闭包)的一种可能是:

  • 在对象的构造函数中创建类方法。
  • 实现私有类成员以及setter和getter的功能。
  • 不污染全局名称空间(当然,每种语言都适用)。

仅举几例...


0

或者,您可以对此有所了解,并利用预处理器的优势(source.c):

#ifndef FIRSTPASS
#include <stdio.h>

//here comes your "nested" definitions
#define FIRSTPASS
#include "source.c"
#undef FIRSTPASS

main(){
#else
    int global = 2;
    int func() {printf("%d\n", global);}
#endif
#ifndef FIRSTPASS
    func();}
#endif

-1

这不是C中的嵌套函数吗?(函数displayAccounts())

我知道我可以用不同的方式定义函数并传递变量,但不是,但是无论如何我都需要多次打印帐户,所以效果很好。

(摘自学校的作业)...

//function 'main' that executes the program.
int main(void)
{
    int customerArray[3][3] = {{1, 1000, 600}, {2, 5000, 2500}, {3, 10000, 2000}};  //multidimensional customer data array.
    int x, y;      //counters for the multidimensional customer array.
    char inquiry;  //variable used to store input from user ('y' or 'n' response on whether or not a recession is present).

    //function 'displayAccounts' displays the current status of accounts when called.
    void displayAccounts(void)
    {
        puts("\t\tBank Of Despair\n\nCustomer List:\n--------------");
        puts("Account #    Credit Limit\t  Balance\n---------    ------------\t  -------");
        for(x = 0; x <= 2; x++)
        {
            for(y = 0; y <= 2; y++)
                printf("%9d\t", customerArray[x][y]);
            puts("\n");
        }
    }

    displayAccounts();  //prints accounts to console.
    printf("Is there currently a recession (y or n)? ");


//...

    return 0;
}

4
它不是合法的标准C语言。如果它可以与您的编译器一起使用,那是因为您的编译器已经提供了对标准C语言的扩展;在某种意义上,你的编译器编译不同的语言,这是严格来说,不是C.
内特埃尔德雷奇

谢谢您的意见。从那以后,我学会了声明,定义和使用函数的正确方法。这有点尴尬回首> <。
midnightCoder

1
@midnightCoder:您可以随时删除答案:)
chqrlie
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.