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

时间:2012-04-21 12:16:05

标签: c++ pointers casting

我正在完成一项学校作业,我需要在其中构建一个线程库。 我需要pc来保存给定Thread对象的run()函数的地址。 当我尝试将成员函数指针强制转换为address_t(实际上是unsigned long int)时,我收到此错误

  

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

     

../ main.cpp中:77:22:   错误:从类型'int(Thread :: *)()'到类型'address_t'的无效转换   {aka unsigned int}'

     

make: * [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);
}

一些澄清:

线程是我写的一个类,目前什么也没做。它作为“主要”功能int run(void)。正如我所说,address_ttypedef unsigned long int

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

2 个答案:

答案 0 :(得分:4)

我认为你不能那样做。

  

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

看看this nice faq。如果您无法转换为void*,则无法转换为intlong int

答案 1 :(得分:1)

这不起作用有两个原因:

  1. 函数指针与void*不兼容(se UmNyobe的答案),
  2. 为了使用成员函数作为线程条目,您还需要存储this指针。
  3. 由于您使用的是C ++,因此您可以获得一些可能性:

    1. 使用定义虚函数的基类thread_base作为线程入口点。
    2. 使用仿函数作为线程入口点。
    3. 在任何一种情况下,您都需要在某处存储此信息,并使用操作系统的线程库调用它。