为什么我可以在另一个函数中定义一个函数
Why can I define a function in another function?
请参阅下面的代码,我在另一个函数中定义了一个函数
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;
}
相关文章:
- 函数向量_指针有不同的原型,我可以构建一个吗
- 为什么在没有显式默认构造函数的情况下,将另一个结构封装在联合中作为成员的结构不能编译
- 创建一个函数以在输入为负数或零时输出字符串.第一次执行用户定义的函数
- 基于另一个成员参数将函数调用从类传递给它的一个成员
- 如何仅为一个函数添加延迟
- 构造函数正在调用一个使用当前类类型的函数
- C++-试图将函数指针推回到另一个CPP文件中的矢量时出错
- 有一个打印语句的函数是一种糟糕的编程实践吗
- 有没有什么方法可以使用一个函数中定义的常量变量,也可以由c++中同一程序中的其他函数使用
- 输入到文件并输出到另一个文件,并将流文件传递给函数
- 我不明白为什么我声明一个空的内部结构并将其传递给构造函数
- 如何创建函数管道,以便函数一个接一个地运行?
- 如何巧妙地编写两个函数——一个用于检查是否存在解决方案,另一个用于获取所有解决方案
- 在c++中的复制构造函数/一个声明语句中的初始化的延续中使用chain方法
- C :基类调用自己的虚拟函数 - 一个反图案
- 如何在这个交换函数(一个单独的链表)中找到错误
- 两个相同的函数(一个使用模板模式,另一个不使用)
- 你怎么能一次给一个函数一个参数呢
- 为什么要做两个函数?(一个是非const,另一个是const)
- 当代码在其他地方使用时,如何保证函数一个接一个地被调用