Cprogramming 简明教程
Nested Functions in C
在编程语境中,术语 nesting 指将一个特定编程元素包含在另一个类似元素中。就如同嵌套循环、嵌套结构等,嵌套函数是一个术语,用于描述在一个函数中使用一个或多个函数。
What is Lexical Scoping?
在 C 语言中,不可能在另一个函数中定义一个函数。简而言之,C 中不支持嵌套函数。函数只能在另一个函数中成为 declared (而不是 defined )。
当一个函数在另一个函数中声明时,它被称为 lexical scoping 。词法作用域在 C 中无效,因为编译器无法访问内部函数的正确内存位置。
Nested Functions Have Limited Use
嵌套函数定义无法访问周围块中的局部变量。它们只能访问全局变量。在 C 中,有两个嵌套作用域: local 和 global 。因此,嵌套函数的用途受到限制。
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