函数可以在c11中使用自己的地址吗?

时间:2015-04-17 00:18:52

标签: c function pointers c11

以下是否有效的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指向的数组给出。但是,如果恰好是对函数' func'的引用,则不希望运行v。

编辑:评论回答了问题:"直接函数调用涉及从函数名到函数指针的隐式转换("衰减")。因此,每个递归函数都有效地获取自己的地址。"

1 个答案:

答案 0 :(得分:1)

typedef void(*ftype)(void*,void*);
void func(void* v, void* w);

ftype myfunc = func; //here

由于我们可以在每个翻译单元中获取 100%未定义的函数的地址,因此没有理由认为C应该具有不允许获取部分定义的函数的地址的规则。当我们检查时,确实没有这样的例外。因此,即使在函数内部,也可以始终获取声明函数的地址。