【发布时间】:2015-04-17 00:18:52
【问题描述】:
以下是有效的 c11 代码吗?我检查了标准,它似乎不受支持,但我可能遗漏了一些东西。这个例子有点做作,但我的实际情况涉及大约一千行代码,没有所有上下文就没有多大意义,这个例子正确地隔离了我想问的主体。关键是我通过直接使用它的标识符来使用函数自己的地址。
typedef void(*ftype)(void*,void*);
void func(void* v, void* w)
{
if( func != (ftype)v ) ((ftype)v)( ((void**)w)[0], ((void**)w)[1]) );
}
因此,我们的想法是运行 v 所指向的函数以获得其副作用,其输入由 w 指向的数组给出。但是,如果 v 恰好是对函数 'func' 的引用,则最好不要运行它。
编辑:一条评论回答了这个问题:“直接函数调用涉及从函数名到函数指针的隐式转换(“衰减”)。因此,每个递归函数都有效地采用自己的地址。”
【问题讨论】:
-
这个问题是怎么重复的?我真的没有看到任何联系。
-
你不能用
ftype f = func;替换函数的主体并得到同样的问题吗? -
我认为这不起作用,我在编辑中解释过。
-
@jack 在 C 中,允许使用递归函数。直接函数调用涉及从函数名到函数指针的隐式转换(“衰减”)。因此,每个递归函数都有效地获取自己的地址。故事结束。