c++基础篇,c++普通成员函数如何转换成void*返回

有时候,需要把c++的类成员函数,当作函数指针返回,并且在外部转换成任何类型的函数指针去调用,可是又不能直接把类成员函数转换成指针,那么就需要用到如下方法:

//arm开发板demo
class Test{
private:
    uint64_t address{};
public:
    Test(){}
    void* func(){
        //使用内联汇编,接收测试参数方便一些
        uint64_t x0, x1, x2, x3, x4, x5, x6, x7;
        uint64_t arg8;

        asm volatile (
                "mov %0, x0\n"    // 读取x0通用寄存器
                "mov %1, x1\n"    // 读取x1通用寄存器
                "mov %2, x2\n"    // 读取x2通用寄存器
                "mov %3, x3\n"    // 读取x3通用寄存器
                "mov %4, x4\n"    // 读取x4通用寄存器
                "mov %5, x5\n"    // 读取x5通用寄存器
                "mov %6, x6\n"    // 读取x6通用寄存器
                "mov %7, x7\n"    // 读取x7通用寄存器
                : "=r" (x0), "=r" (x1), "=r" (x2), "=r" (x3),
        "=r" (x4), "=r" (x5), "=r" (x6), "=r" (x7), "=r" (x8)
                :
                :"memory"
                );
        
        LOGD("x0: %#lx", x0);
        LOGD("x1: %#lx", x1);
        LOGD("x2: %#lx", x2);
        LOGD("x3: %#lx", x3);
        LOGD("x4: %#lx", x4);
        LOGD("x5: %#lx", x5);
        LOGD("x6: %#lx", x6);
        LOGD("x7: %#lx", x7);
        return (void*)123456;
    }

    void* ret_func_ptr(){
        union {
            void* (Test::*member_func)();
            void* generic_ptr;
        } u{};
        u.member_func = &Test::func;
        return u.generic_ptr;
    }

};

int main(){
    Test t;
    // 获取成员函数指针
    void* ptr = t.ret_func_ptr();
    auto ret = (std::uint64_t)((void*(*)(int,int,int,int,int,int,int,int))ptr)(0x123456,0x7894561,0x66666,0x66666,0x123456,0x7894561,0x66666,0x66666);
    LOGD("ret:%lu",ret);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值