使用 CPP 获取成员函数的地址
Getting the address of a member function, using CPP
我正在做一项学校作业,我需要在其中构建一个线程库。我需要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*
,则无法转换为 int
或 long int
这不起作用,原因有两个:
- 函数指针与
void*
不兼容(se UmNyobe的答案),并且 - 为了使用成员函数作为线程条目,您还需要存储一个
this
指针。
由于您正在使用C++因此您有一些可能性:
- 使用基类
thread_base
将虚拟函数定义为线程入口点。 - 使用函子作为线程入口点。
无论哪种情况,您都需要将此信息存储在某个位置,并使用操作系统的线程库调用它。
相关文章:
- 如何在c++程序中找到函数的地址
- 函数名是c中该函数的第一条指令的地址吗
- 从 C++ 中的函数返回数组地址问题
- 为什么成员函数地址离自由函数这么远?
- 调用 lua 函数的地址为 C/C++?
- 在 Microsoft Access SQL 中调用自定义 DLL 函数时传递的内存地址无效
- 为什么每次执行时函数的地址都不同?
- 我正在尝试将表的地址传递给要在另一个函数中使用的指针,但得到不兼容的指针类型
- 获取函数的地址?
- 模板到函数的时刻地址是否可以作为指向某个函数的函数指针传递?
- 为什么使用存储在虚拟方法表中的地址调用虚拟函数的函数会返回垃圾?
- 指针在函数调用后更改其地址
- 在 gcc/clang (C++) 中获取函数范围之外的标签地址
- 在每个运行时将函数保存到相同的地址
- 在指向现有内存地址的 hpp 文件中声明成员函数的最佳方法
- 创建一个函数来转换数组元素的类型并返回数组的地址
- 如何定义全局函数指针并分配给特定地址
- 常量引用函数参数的地址何时唯一?
- 打印我的Get MAC地址函数的std::字符串时出现意外输出
- 成员函数地址(函数指针)