c函数中可以定义内部函数吗?

小魔菇 2009-03-24 11:22:04
函数中可以定义内部函数吗?
如果可以的话
该怎么理解和使用呢?
...全文
2615 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
Vo_Go 2011-10-01
  • 打赏
  • 举报
回复
用到了,但是无法编译通过。。。
小魔菇 2009-03-31
  • 打赏
  • 举报
回复

这样阿
学习了
  • 打赏
  • 举报
回复
老实说,基本没用过。
yangch_nhcmo 2009-03-24
  • 打赏
  • 举报
回复
C语言不支持在函数内部定义函数的
xfinal2006 2009-03-24
  • 打赏
  • 举报
回复
这项技术除了增加编译器的复杂度之外似乎没有任何好处.
lbh2001 2009-03-24
  • 打赏
  • 举报
回复
为了使编译器设计时简单些,C语言中不可以定义内部函数,但Pascal/Delphi中可以
yyyapple 2009-03-24
  • 打赏
  • 举报
回复
所谓内嵌函数就是定义于另一个函数内部的函数.(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)的技术实现内嵌函数的地址的获取。关于该技术的文章能够在
http://people.debian.org/~aaronl/Usenix88-lexic.pdf 找到。
假如在包含函数中显式定义了一个标签,一个内嵌函数能够跳转到从包含函数中继承过来的标签处。调用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];
}
...
}
yyyapple 2009-03-24
  • 打赏
  • 举报
回复
所谓内嵌函数就是定义于另一个函数内部的函数.(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)的技术实现内嵌函数的地址的获取。关于该技术的文章能够在
http://people.debian.org/~aaronl/Usenix88-lexic.pdf 找到。
假如在包含函数中显式定义了一个标签,一个内嵌函数能够跳转到从包含函数中继承过来的标签处。调用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];
}
...
}
pengzhixi 2009-03-24
  • 打赏
  • 举报
回复
函数中可以定义内部函数吗?
如果可以的话

明确告诉你NO
rilon1988 2009-03-24
  • 打赏
  • 举报
回复
只是支持函数的嵌套调用和函数的递归。
rjianfeili 2009-03-24
  • 打赏
  • 举报
回复
看过

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧