【问题标题】:Can I compare a function pointer to a function for equality?我可以比较函数指针和函数的相等性吗?
【发布时间】:2019-08-14 02:32:42
【问题描述】:

这是有效的 C99 代码吗? (我想我在问它是否便携)

void test(void){
return;
}

void (*fp)(void) = test;

if (fp == test){ <--- This line
    printf("Success\n");
}

我只收集了相同类型的指针可以相互比较,所以也许我的问题是像'test'这样的函数名是否只是指针别名?或者也许有人可以告诉我我的问题比我更好:)

【问题讨论】:

  • 是的,fp 将在分配后将地址保存到test

标签: c function-pointers c99


【解决方案1】:

代码是有效的 ANSI C。

实际上发生的情况是,代码中的函数名称(例如 test)会自动转换为指向函数的指针。

你可以把test改成&amp;test,结果是一样的。

【讨论】:

    【解决方案2】:

    是的,没关系。在这种情况下,C 标准是不言自明的(C11 6.3.2.1/4):

    函数指示符是具有函数类型的表达式。除了当它是 sizeof 运算符的操作数,或一元 &amp; 运算符,一个函数指示符 类型“函数返回类型”被转换为具有“指向函数返回类型的指针”类型的表达式。

    在您的情况下,test 是具有函数类型的表达式。它被转换为void(*)(void) 类型的函数指针。这是与fp 兼容的指针类型,因此== 运算符允许它。

    关于相等运算符==,标准说(C11 6.5.9,强调我的):

    两个指针比较相等,如果且仅当两者都是空指针时,都是指向同一个对象的指针(包括指向对象的指针和开头的子对象) 或 函数,

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-10-05
      • 1970-01-01
      • 2013-11-22
      • 1970-01-01
      • 2021-01-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多