<分区>
将函数指针转换为 int 然后将其转换回去并进行间接调用是否是 C++ 中的未定义行为?像这样:
void f()
{
puts("Hello\n");
}
int pf = (int)f;
//...some time later
typedef void (*PVoidFunc)();
(*(PVoidFunc)pf)();
假设 int 和 pointer 的大小相同。
编辑:架构是 32 位的——它是普通的 Android。
不过重要的是,我们讨论的是函数指针,而不是数据指针。根本问题与 Thumb 函数具有两个地址的方式有关——它们的真实起始地址(2 对齐)和需要 BLX 到的值(地址或 1)。我认为 GCC 试图在这方面变得聪明,但结果却相当虚假。
自然地,问题是这在特定情况下对我不起作用,但在非常相似的情况下有效 :) 但我想知道这是否是编译器错误,编译器试图解决棘手的底层问题问题,或未定义的未定义行为。