Cprogramming 简明教程

Nested Functions in C

在编程语境中,术语 nesting 指将一个特定编程元素包含在另一个类似元素中。就如同嵌套循环、嵌套结构等,嵌套函数是一个术语,用于描述在一个函数中使用一个或多个函数。

What is Lexical Scoping?

在 C 语言中,不可能在另一个函数中定义一个函数。简而言之,C 中不支持嵌套函数。函数只能在另一个函数中成为 declared (而不是 defined )。

当一个函数在另一个函数中声明时,它被称为 lexical scoping 。词法作用域在 C 中无效,因为编译器无法访问内部函数的正确内存位置。

Nested Functions Have Limited Use

嵌套函数定义无法访问周围块中的局部变量。它们只能访问全局变量。在 C 中,有两个嵌套作用域: localglobal 。因此,嵌套函数的用途受到限制。

Example: Nested Function

如果你想创建一个类似于下面所示的嵌套函数,那么它将产生一个错误 −

#include <stdio.h>

int main(void){

   printf("Main Function");

   int my_fun(){

      printf("my_fun function");

      // Nested Function
      int nested(){
         printf("This is a nested function.");
      }
   }
   nested();
}

在运行这段代码时,你会收到一个错误 −

main.c:(.text+0x3d): undefined reference to `nested'
collect2: error: ld returned 1 exit status

Trampolines for Nested Functions

嵌套函数作为“GNU C”中的一个扩展受到支持。GCC 通过使用称为 trampolines 的技术实现获取嵌套函数的地址。

在声明中,它要求函数以上述关键字 auto 为前缀。

Example 1

请看以下示例:

#include <stdio.h>

int main(){

   auto int nested();
   nested();

   printf("In Main Function now\n");

   int nested(){
      printf("In the nested function now\n");
   }

   printf("End of the program");
}

当你运行这段代码时,它将产生以下输出:

In the nested function now
In Main Function now
End of the program

Example 2

在该程序中,一个函数 square() 嵌套在另一个函数 myfunction() 中。嵌套函数使用 auto 关键字进行声明。

#include <stdio.h>
#include <math.h>

double myfunction (double a, double b);

int main(){
   double x = 4, y = 5;
   printf("Addition of squares of %f and %f = %f", x, y, myfunction(x, y));
   return 0;
}

double myfunction (double a, double b){
   auto double square (double c) { return pow(c,2); }
   return square (a) + square (b);
}

运行代码并检查其输出:

Addition of squares of 4.000000 and 5.000000 = 41.000000

Nested Functions: Points to Note

在使用嵌套函数时需要注意以下几点 −

  1. 嵌套函数可以访问在定义前面包含函数的所有标识符。

  2. 嵌套函数不能在包含函数退出之前调用。

  3. 嵌套函数不能使用 goto 语句跳到包含函数中的标签。

  4. 允许在函数中嵌套函数定义,它可以与块中的其他声明和语句混合。

  5. 如果你尝试在包含函数退出后通过其地址调用嵌套函数,它会抛出一个错误。

  6. 嵌套函数永远没有关联性。用“extern”或“static”声明总会出现错误。