使用 CPP 获取成员函数的地址

Getting the address of a member function, using CPP

本文关键字:地址 函数 成员 CPP 获取 使用      更新时间:2023-10-16

我正在做一项学校作业,我需要在其中构建一个线程库。我需要pc来保存给定 Thread 对象的 run() 函数的地址。当我尝试将成员函数指针转换为address_t(实际上是无符号的长整型)时,出现此错误

../main.cpp:在函数"void setup(Thread&)"中:

../main.cpp:77:22: 错误:从类型"int (线程::*)()"转换为类型"address_t"无效 {aka unsigned int}'

制造: * [main.o] 错误 1

这是我收到错误的函数:

void setup(Thread &thread)
{
    address_t sp, pc;
    sp = (address_t)stack1 + STACK_SIZE - sizeof(address_t);
    int (Thread::*temp)() = &Thread::run;
    pc = (address_t) temp; // @@ LINE 77 @@
    sigsetjmp(jbuf[0],1);
    (jbuf[0]->__jmpbuf)[JB_SP] = translate_address(sp);
    (jbuf[0]->__jmpbuf)[JB_PC] = translate_address(pc);
    sigemptyset(&jbuf[0]->__saved_mask);
}

一些澄清:

Thread是我写的一个类,目前什么都不做。它作为int run(void)作为其"主要"功能。 address_t,正如我所说,typedef unsigned long int

关于为什么我收到此错误的任何想法? 谢谢

我认为你不能这样做。

void 指针是指向数据的指针,函数指针指向函数。该语言不要求函数和数据位于同一地址空间中,因此,作为示例而不是限制,在将它们位于不同地址空间的体系结构上,两种不同的指针类型将不具有可比性。

看看这个不错的常见问题解答。如果无法转换为 void* ,则无法转换为 intlong int

这不起作用,原因有两个:

  1. 函数指针与void*不兼容(se UmNyobe的答案),并且
  2. 为了使用成员函数作为线程条目,您还需要存储一个this指针。

由于您正在使用C++因此您有一些可能性:

  1. 使用基类thread_base将虚拟函数定义为线程入口点。
  2. 使用函子作为线程入口点。

无论哪种情况,您都需要将此信息存储在某个位置,并使用操作系统的线程库调用它。