【问题标题】:Comparing function pointers比较函数指针
【发布时间】:2012-10-05 13:56:06
【问题描述】:

如何比较 C++ 中的函数指针?稳定吗?

例如,这样的事情是否有效:

if(pFnc == &myFnc){
//Do something
}

【问题讨论】:

  • 你说的稳定是什么意思?在编译器的不同运行中生成两个函数的顺序?功能在应用程序的一个特定运行中的位置?动态库呢,你关心吗?
  • 这就是我的意思,当涉及到更复杂的系统时,肯定会有问题吗?!
  • 问题是什么?你想在什么范围内考虑稳定性,你要追求的稳定性是什么意思?否则,这不是一个合适的问题,我将是第一个投票结束的人。
  • 正如您所指出的,这种比较的稳定性取决于您正在考虑的稳定性范围。我正在 MFC 中构建应用程序,并且正在比较某些 WndProc 函数的地址。那么在这个范围内,它会稳定吗?
  • 如果您正在寻找精确的比较(即==),这是正确的。对于任何不等式,顺序是未定义的,但在应用程序的单次运行中是稳定的(假设它不是加载的 dll),可能跨同一个二进制文件的多次执行(同样,不涉及 dll)。如果涉及 dll,只要不重新加载 dll,订单将保持不变......对于其他任何事情,您的赌注都是关闭的(这也适用于==:如果您卸载并重新加载 dll,它可能不会测试相等,因为它可能已加载到不同的地址...

标签: c++


【解决方案1】:

C++03 5.10/1 [expr.eq]:

==(等于)和!=(不等于)运算符具有相同的 语义限制、转换和结果类型作为关系 运算符,除了它们的较低优先级和真值结果。 [注:a 指向相同类型的对象或函数的指针(在指针转换之后)可以比较是否相等。两个指针相同 类型比较相等当且仅当它们都为空时,都指向 相同的函数,或者都代表相同的地址(3.9.2)。

强调我的。

【讨论】:

  • @Luchian:谢谢,我一直在努力获得正确的格式。
  • 我一直在寻找重点,但找不到:P
  • 干杯,正如 David Rodríguez - dribeas 指出的那样,DLL 呢?
  • @user965369 - 该标准不了解 DLL。但是,该标准确实知道(数据)指针。根据标准,使用指向已删除内存的指针是未定义的行为。这同样适用于使用函数指针指向已通过FreeLibrary 卸载的库中的函数。它本质上是未定义的行为。
  • 谢谢大卫!现在我所有的恐惧都得到了解决:D
【解决方案2】:

函数指针本质上是一个内存地址,就像 C++ 中的任何其他指针一样。因此,在比较指针时,您总是在比较内存地址而不是值,这意味着只要两个指针属于同一类型,这些指针指向的内容并不重要。

【讨论】:

    【解决方案3】:

    pFnc 和 myFnc 都必须定义。正确的比较是:

    if(pFnc == myFnc)
    {
        //Do something
    }
    

    【讨论】:

    • myFnc 只是一个全局范围的函数,在你的代码中你肯定只是将指针值与实际值进行比较?错了?!
    • 函数名充当指针。你不需要使用&myFnc。
    • 你可以同时使用。如果将函数用作指针,编译器将自动取消引用它,但最好自己专门取消引用
    • @Donotalo:为什么你不需要&,声称删除它会使它更正确是在延长它。我声称使用& 更正确,因为这是编译器最终将解释的内容......(我真的不想提倡其中一种,也不想讨论它,但我不太喜欢声称这个选项是正确的)
    • @Donotalo:不,仅当用作 rvalue 时,函数才会衰减为指针,但在 &myfunc 中,标识符是 lvalue它不会腐烂。 &myfunc 是函数的地址。你的最后一条评论听起来像我想生活在一个函数是一个指针并像它一样工作的错误中,但是一个函数不是一个指针以同样的方式数组不是指针。这实际上是键入& 的更多原因:避免将函数与指针混淆!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-01-19
    • 2020-06-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多