我正在完成一项学校作业,我需要在其中构建一个线程库。
我需要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_t
是typedef unsigned long int
关于我为什么会收到此错误的任何想法?感谢
答案 0 :(得分:4)
我认为你不能那样做。
void指针是指向数据的指针,函数指针指向函数。该语言不要求函数和数据在同一地址空间中,因此,作为示例而非限制,对于将它们放在不同地址空间中的体系结构,两种不同的指针类型将不具有可比性。
看看this nice faq。如果您无法转换为void*
,则无法转换为int
或long int
答案 1 :(得分:1)
这不起作用有两个原因:
void*
不兼容(se UmNyobe的答案),this
指针。由于您使用的是C ++,因此您可以获得一些可能性:
thread_base
作为线程入口点。在任何一种情况下,您都需要在某处存储此信息,并使用操作系统的线程库调用它。