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

时间:2013-05-16 08:37:02

标签: c++ c gcc

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

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中调用。

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

4 个答案:

答案 0 :(得分:17)

是的,这是GCC extension

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

答案 1 :(得分:4)

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

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

答案 2 :(得分:2)

答案 3 :(得分:0)

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

#include<stdio.h>
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;
 }