以下是否有效的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。
编辑:评论回答了问题:"直接函数调用涉及从函数名到函数指针的隐式转换("衰减")。因此,每个递归函数都有效地获取自己的地址。"
答案 0 :(得分:1)
typedef void(*ftype)(void*,void*);
void func(void* v, void* w);
ftype myfunc = func; //here
由于我们可以在每个翻译单元中获取 100%未定义的函数的地址,因此没有理由认为C应该具有不允许获取部分定义的函数的地址的规则。当我们检查时,确实没有这样的例外。因此,即使在函数内部,也可以始终获取声明函数的地址。