在下面的代码中,似乎无法获得第二个函数的正确地址 链接到Ideone:http://ideone.com/r07UZc
#include <stdio.h>
class A
{
public:
__attribute__((noinline)) int func1();
__attribute__((noinline)) int func2();
};
int A::func1()
{
return 1;
}
int A::func2()
{
return 2;
}
int main()
{
printf("%p %p\n", &A::func1, &A::func2);
return 0;
}
打印值为:0x80484d0 (nil)
第一个地址似乎是正确的,但不是第二个。为什么?
答案 0 :(得分:2)
指向成员函数的指针是非常奇怪的野兽。它们很少只是函数代码的地址。
即使它们是,它们仍然是void*
所期望的printf
非常不同的类型,因此printf
会调用未定义的行为,试图将它们解释为void*
。< / p>
在您的特定情况下,原因可能是成员函数指针宽于void*
(宽度的两倍,可能是?),因此第二个%p
打印{{1}的第二部分}。但这仅仅是一个猜想 - 唯一确定的是它是UB。
鉴于标准中没有用于从指向成员函数的指针获取地址的工具,如果没有特定于编译器的hackery,未定义的行为或两者兼而有之,则可能无法做到这一点。