考虑一个这样的函数:
int f() {
int foo = 10;
int bar = 20;
int g(int param) {
foo += 2;
return param + foo + bar;
}
return g(10); // 42
}
似乎很不寻常。这个函数在其内部声明了一个函数,在里面的函数似乎还可以使用和更改外层函数的局部变量。 当然,这段代码不是标准 C. 这是 GNU C 扩展——嵌套函数 (Nested function)。 嵌套函数能够帮我们简化一些繁琐的操作。考虑数组迭代函数:
void array_iterate(void** array, size_t len, void (*function)(void*)) {
for(size_t i = 0; i < len; i++){
function(array[i]);
}
}
借助嵌套函数,我们可以这样写:
void fancy_operation(int* array, size_t len, int iter_param) {
void plus_n(void* num) {
printf("%d\n", iter_param + ((int) num));
}
array_iterate((void**) array, len);
}
还可以这样写:
void fancy_operation2() {
int value = 1;
int array[] = {1, 2, 3, 4, 5};
for(; value < 5; value++) {
void f(void* x) {
printf("%d\n", value * ((int) x));
}
array_iterate((void**) array, 5, f);
}
}
当然,这些操作看起来并没有什么好玩的——它们甚至可以直接转换成普通的函数。其实任何一个嵌套函数都可以通过全局变量改写成为普通函数。不过嵌套函数的存在似乎可以给代码加一种整洁的错觉。
正在加载评论……