比较函数指针

19

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

例如,像这样的代码是否有效:

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

“stable”是什么意思?是指编译器在不同运行中生成两个函数的顺序吗?还是指应用程序在一次运行中函数的位置?那么动态库呢?你关心它们吗? - David Rodríguez - dribeas
这就是我所指的,当涉及到更复杂的系统时,肯定会存在问题! - user965369
1
问题是什么?您想在什么范围内考虑稳定性,以及您想追求的稳定性意义是什么?如果没有这些信息,这不是一个合适的问题,我将成为第一个投票关闭的人。 - David Rodríguez - dribeas
正如你所指出的那样,这种比较的稳定性取决于你考虑的稳定性范围。我正在使用MFC构建一个应用程序,并比较某些WndProc函数的地址。因此,在这个范围内,它是稳定的吗? - user965369
2
如果您正在寻找精确比较(即==),那么是正确的。对于任何不等式,顺序是未定义的,但在应用程序的单个运行中保持稳定(假设它不是已加载的dll),可能跨多个相同二进制文件的执行(同样,没有涉及dll)。如果涉及dll,则只要不重新加载dll,顺序就会被维护...对于其他所有内容,您的所有赌注都将关闭(这也适用于==:如果卸载并重新加载dll,则可能不测试相等性,因为它可能已经在不同的地址加载... - David Rodríguez - dribeas
显示剩余2条评论
3个回答

19

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

等于(equal to)和不等于(not equal to)运算符与关系运算符有相同的语义限制、转换和结果类型,除了它们的优先级较低且返回真值结果。【注意:当 a < b 和 c < d 具有相同的真值时,a < b == c < d 为真。】相同类型的对象或函数指针(经过指针转换后)可以进行相等比较。如果两个相同类型的指针都是空指针,都指向同一个函数,或者都表示同一地址(3.9.2),则它们相等。

强调部分为本人添加。


@Luchian:谢谢,我一直在努力调整格式。 - John Dibling
我在寻找重点,但是找不到 :P - Luchian Grigore
干杯,正如David Rodríguez - dribeas所指出的那样,DLL怎么办? - user965369
2
@user965369 - 标准不知道DLL。然而,标准确实知道(数据)指针。使用指向已删除内存的指针是标准中未定义的行为。同样适用于使用函数指针调用已通过“FreeLibrary”卸载的库中的函数。这基本上是未定义的行为。 - David Hammen
谢谢David!现在我所有的担忧都得到了解决 :D - user965369
两个针对不同类型的模板实例化最终生成相同机器码的函数是否是不同的函数?如果是的话,这个条款会使得常见的函数折叠优化变得非法……我想是这样的吧? - undefined

2

函数指针本质上与C++中的任何其他指针一样,都是一个内存地址。因此,在比较指针时,您始终在比较内存地址而不是值,这意味着只要两个指针是相同类型的,那么它们所指向的内容并不重要。


0

必须定义 pFncmyFnc。正确的比较应该是:

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

myFnc只是全局作用域中的一个函数,在你的代码中,你只是在比较一个指针值和实际值?错了吧? - user965369
4
函数名充当指针。您不需要使用&myFnc - Donotalo
2
你可以两种方式都使用。如果函数被用作指针,编译器会自动解引用,但最好还是明确地自己解引用。 - SwiftMango
2
@Donotalo:为什么你不需要&,声称去掉它会使它更正确,这有点牵强。我认为带上&更正确,因为这是编译器最终要解释的内容...(我不想倡导其中任何一种方法,也不想讨论它,但我不太喜欢这个选项被称为正确的说法) - David Rodríguez - dribeas
3
不,只有当函数被用作 右值 时才会衰减为指针,但在 &myfunc 中标识符是 左值,它不会衰减。&myfunc 就是 函数的地址。你最后的评论听起来像是 我想生活在一个函数指针并且行为就像它一样的谬论中,但是函数不是指针,就像数组不是指针一样。这实际上更加理由去键入 &: 避免将函数与指针混淆! - David Rodríguez - dribeas
显示剩余5条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接