请参阅下面的代码,我在另一个函数中定义一个函数,
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中调用。
更重要的是,这种用法的常见场景是什么?这个用法用于什么?
答案 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;
}