【问题标题】:Getting the address of a member function, using CPP使用 CPP 获取成员函数的地址
【发布时间】:2012-04-21 12:16:05
【问题描述】:

我正在处理一项需要构建线程库的学校作业。 我需要pc 来保存给定线程对象的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);
}

一些澄清:

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

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

【问题讨论】:

  • 不要以这种方式使用非静态成员函数。使用非成员函数或静态成员函数。没有类实例就不能调用成员函数。

标签: c++ pointers casting


【解决方案1】:

我认为你做不到。

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

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

【讨论】:

    【解决方案2】:

    这不起作用有两个原因:

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

    由于您使用的是 C++,但您有一些可能性:

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

    在任何一种情况下,您都需要将此信息存储在某处并使用操作系统的线程库调用它。

    【讨论】:

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