如何获取成员函数的地址指针

时间:2013-09-11 13:15:32

标签: c++

在下面的代码中,似乎无法获得第二个函数的正确地址 链接到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)
第一个地址似乎是正确的,但不是第二个。为什么?

1 个答案:

答案 0 :(得分:2)

指向成员函数的指针是非常奇怪的野兽。它们很少只是函数代码的地址。

即使它们是,它们仍然是void*所期望的printf非常不同的类型,因此printf会调用未定义的行为,试图将它们解释为void*。< / p>

在您的特定情况下,原因可能是成员函数指针宽于void*(宽度的两倍,可能是?),因此第二个%p打印{{1}的第二部分}。但这仅仅是一个猜想 - 唯一确定的是它是UB。

鉴于标准中没有用于从指向成员函数的指针获取地址的工具,如果没有特定于编译器的hackery,未定义的行为或两者兼而有之,则可能无法做到这一点。