为什么我可以在另一个函数中定义一个函数?

看到下面的代码,我在另一个函数中定义了一个函数,

void test1(void) { void test2(void) { printf("test2\n"); } printf("test1\n"); } int main(void) { test1(); return 0; } 

这个用法很奇怪,是用c89 / c99还是只用gcc的扩展名(我在ubuntu 12编译时使用了gcc 4.6.3)。 我运行此代码并输出“test2”和“test1”.test2只能在test1中调用。

更重要的是,这种用法的常见场景是什么或者这种用法用于什么?

是的,这是GCC扩展 。

这不是C,它不是便携式的,因此不是非常推荐,除非你知道GCC会

  • 是唯一用于构建代码的编译器
  • 将来版本将继续支持此function
  • 不要关心最不惊讶的原则 。

如上所述,它不是合法的C ++。 但是,您可以在函数中定义类,并在该类中定义函数。 但即便如此,在C ++ 11之前,它仍然只是词法嵌套; 你定义的类不会“捕获”外部函数的任何上下文(除非你明确地实现了捕获); 在真正的嵌套函数中,嵌套函数可以访问外部函数中的局部变量。 在C ++ 11中,您可以使用自动捕获定义lambda函数。

C和C ++从未采用嵌套函数的原因因为为了使捕获工作,您需要额外的信息,结果是指向函数的指针变得更加复杂。 结果是你不能获取嵌套函数的地址(缺乏正交性),指向嵌套函数的指针与指向函数的普通指针不兼容(最终需要太多的外部细节来实现),或者所有指向函数的指针都有额外的信息(你需要为大多数时候都不用的东西付费)。

嵌套函数仅在C中允许但很少使用,因为它们仅在该函数范围内可见。 但是,如果要解决嵌套函数,可以执行以下操作

 #include typedef void (*fptr)(void); fptr test1(void) { void test2(void) { printf("test2\n"); } printf("test1\n"); return test2; } int main(void) { void (*f)(void); f = test1(); f(); return 0; }