【问题标题】:Can a function use its own address in c11?函数可以在 c11 中使用自己的地址吗?
【发布时间】: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 中,允许使用递归函数。直接函数调用涉及从函数名到函数指针的隐式转换(“衰减”)。因此,每个递归函数都有效地获取自己的地址。故事结束。

标签: c function pointers c11


【解决方案1】:
typedef void(*ftype)(void*,void*);
void func(void* v, void* w);

ftype myfunc = func; //here

由于我们可以获取每个翻译单元中100% 未定义的函数的地址,因此 C 没有理由禁止获取部分定义的函数的地址。而当我们检查时,确实没有这样的例外。因此,您始终可以获取已声明函数的地址,即使在函数内部也是如此。

【讨论】:

    猜你喜欢
    • 2018-11-27
    • 2019-10-08
    • 2021-07-09
    • 1970-01-01
    • 2019-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多