C中的嵌套函数

我们可以在C中有一个嵌套函数吗? 什么是嵌套函数的使用? 如果它们存在于C中,它们的实现在编译器和编译器之间是不同的

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

标准C中的另一个函数中不能定义函数

你可以在一个函数内声明一个函数,但它不是一个嵌套的函数。

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

不,他们不存在于C.

他们用于像Pascal这样的语言(至less)有两个原因:

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

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

例如

 void f(void) { // Declare a function called g void g(void); // Call g g(); } // Definition of g void g(void) { } 

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

我提到这一点,因为许多C语言编程人员现在正在使用C ++编译器(例如Visual C ++和Keil uVision)来执行此操作,因此您可以使用此…

尽pipeC语言还没有被允许,但是如果你使用C ++,你可以用C ++ 11中引入的lambda函数来达到同样的效果:

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

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

在某些语言中使用嵌套函数将多个函数和variables放入一个容器(外部函数),以便从外部不能看到各个函数(不包括外部函数)和variables。

C中 ,这可以通过将这些函数放在一个单独的源文件中来完成。 将主函数定义为全局函数,将所有其他函数和variables定义为静态函数。 现在只有主function在这个模块之外是可见的。

要回答第二个问题,有些语言允许定义嵌套函数(可以在这里find一个列表: 嵌套函数语言列表维基百科 )。

在这些语言中最着名的JavaScript之一,嵌套函数(称为闭包)的一些用法是:

  • 在对象的构造函数中创build类方法。
  • 为了实现私人类成员以及setter和getter的function。
  • 不要污染全局命名空间(当然,每种语言都适用)。

举几个例子

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

我知道我可以定义不同的function,并通过variables,但不能很好地工作,因为我需要打印帐户多次。

(从学校任务中​​取出的snipet)…

 //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; }