【问题标题】:How to get address pointer of a member function [duplicate]如何获取成员函数的地址指针[重复]
【发布时间】:2013-09-11 13:15:32
【问题描述】:

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

【问题讨论】:

标签: c++


【解决方案1】:

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

即使它们是,它们仍然与printf 预期的void* 非常不同,因此printf 调用未定义的行为试图将它们解释为void*

在您的特定情况下,原因可能是成员函数指针比void* 宽(也许是两倍宽?),因此第二个%p 打印&amp;A::func1 的第二部分。但这只是一个猜想——唯一可以确定的是它是 UB。

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

【讨论】:

    猜你喜欢
    • 2011-06-27
    • 1970-01-01
    • 2022-12-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多