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

Why can I define a function in another function?

本文关键字:函数 一个 我可以 另一个 为什么 定义      更新时间:2023-10-16

请参阅下面的代码,我在另一个函数中定义了一个函数

void test1(void)
{
 void test2(void)
 {
   printf("test2n");
 }
 printf("test1n");
}
int main(void)
{
 test1();
 return 0;
}

这种用法很奇怪,是c89/c99的用法,还是只是gcc的扩展(我在编译的ubuntu 12中使用了gcc 4.6.3(。我运行这段代码,它输出"test2"answers"test1"。test2只能在test1中调用。

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

是的,这是GCC扩展。

它不是C,它不是可移植的,因此不太推荐,除非你知道GCC会

  • 成为用于构建代码的唯一编译器
  • 将在未来版本中继续支持此功能
  • 不要在意最小惊奇的原则

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

C和C++从未采用嵌套函数的原因是,因为为了使捕获工作,您需要其他信息,结果是指向函数的指针变得更加复杂。结果是,您无法获取嵌套函数(缺乏正交性(,指向嵌套函数的指针函数与指向函数的普通指针不兼容(最终需要太多的外部细节来敲击out(,或者所有指向函数的指针都具有额外信息(你会为大部分时间不用的东西买单(。

http://gcc.gnu.org/onlinedocs/gcc-3.0.2/gcc_5.html#SEC71

嵌套函数说明。

嵌套函数只允许在C中使用,但很少使用,因为它们仅在该函数范围内可见。然而,如果你想解决嵌套函数的问题,你可以做这样的

#include<stdio.h>
typedef void (*fptr)(void);
fptr test1(void) {
    void test2(void) {
        printf("test2n");
    }
printf("test1n");
return test2;
}
int main(void) {
    void (*f)(void);
    f = test1();
    f();
    return 0;
 }
相关文章: