所谓内嵌函数就是定义于另一个函数内部的函数.(GNU C++不支持内嵌函数) 内嵌函数名在它被定义的块中是局部有效的。例如这里我们定义了一个函数squre并调用了它两次: foo ( double a, double b ) { double square (double z) { return z * z; } return square (a) + square (b); } 包含内嵌函数的函数内的所有变量对于内嵌函数都是可见的。这称为词法作用域(lexical scoping)。例如这里我们给出一个内嵌函数,它使用了一个继承得到的变量,叫offset: bar (int *array, int offset, int size) { int access (int *array, int index) { return array[index + offset]; } int i; ... for (i = 0; i < size; i++) ... access (array, i) ... } 函数内部,允许变量定义的地方就能定义内嵌函数:也就是说,在任何程序块(block)内,第一条语句之前。从内嵌函数名所在有效域之外通过存储它的地址或者把它的地址传给其他函数来调用它也是可行的: hack (int *array, int size) { void store (int index, int value) { array[index] = value; } intermediate (store, size); } 这里,函数store的地址作为参数传给了函数intermediate。如果intermediate调用了store,store的参数就会被存储到array里面了。但是这种方式只用当包含store的包含函数(hack)没有返回时才有效。 如果你在当包含函数已经退出后再通过地址方式来调用内嵌函数, 结果不可预料。 如果当你试着在内嵌函数的包含域退出之后调用它,而它使用了某些已经不可见的变量,你可能很幸运的得到正确结果,但是去冒这种风险并不明智。然而,如果内嵌函数没有使用到任何已经不可见的量则应该是安全的。 GCC使用了称为弹床(tramplines)的技术实现内嵌函数的地址的获取。关于该技术的文章可以在 [url]http://people.debian.org/~aaronl/Usenix88-lexic.pdf[/url] 找到。 如果在包含函数中显式定义了一个标签,一个内嵌函数可以跳转到从包含函数中继承过来的标签处。调用goto进行跳转的内嵌将立刻返回(同时也使得中介函数也返回)到包含函数。例如: bar (int *array, int offset, int size) { __label__ failure; int access (int *array, int index) { if (index > size) goto failure; return array[index + offset]; } int i; ... for (i = 0; i < size; i++) ... access (array, i) ... ... return 0; /* Control comes here from access if it detects an error. */ failure: return -1; } 一个内嵌函数总是使用文件内部链接方式。声明一个带extern的内嵌函数将产生错误。如果你需要在定义一个内嵌函数前声明它,要使用auto关键字(除此种情况之外,在函数定义时使用auto没有任何意义)。 bar (int *array, int offset, int size) { __label__ failure; auto int access (int *, int); ... int access (int *array, int index) { if (index > size) goto failure; return array[index + offset]; } ... } |
gcc对C语言的扩展:内嵌函数(Nested Function)
原创
©著作权归作者所有:来自51CTO博客作者nathanxu的原创作品,如需转载,请与作者联系,否则将追究法律责任
上一篇:开源思想在中国
提问和评论都可以,用心的回复会被更多人看到
评论
发布评论
相关文章
-
【C语言加油站】qsort函数的模拟实现
【C语言加油站】qsort函数的模拟实现本文详细介绍了使用冒泡排序的逻辑模拟实现可以排序任意类型数组的qsort函数……
C语言 qsort排序函数 冒泡排序 回调函数 void*指针 -
C++对C的函数的扩展==》内联函数
1、inline内联函数结论:
C++ inline 内联函数 -
你知道GNU C 对C语言的扩展吗?
为了方便使用,GNU C在标准C语言的基础上进行了部分方便开发的扩展。这里讲解一些开发中可能会用到的,或者使用频率比较高的内容。零长度数组和变量长度数组GNU C 允许使用零长度数组,比如...
java 编程语言 python javascript js -
C++对C的扩展
C++对C的扩展C对C的扩展感官认识与C语言的关系发展历史对C语言的加强1命名空间2实用性增强3register增强4变量检测
c语言 c++ 命名空间 编译器 ios -
GCC中的内嵌汇编语言操作数 寄存器 字符串 汇编语言 汇编指令