6

我有一个无符号整数数组,需要存储指向数据和函数的指针以及一些数据。在我正在使用的设备中,sizeof 指针与 sizeof unsigned int 相同。如何将指向函数的指针转换为 unsigned int?我知道这使代码不可移植,但它是特定于微控制器的。我试过这个:

stackPtr[4] = reinterpret_cast<unsigned int>(task_ptr);

但它给了我一个错误“无效的类型转换”

将其转换为 void 指针,然后转换为 int 很麻烦。

stackPtr[4] = reinterpret_cast<unsigned int>(static_cast<void *> (task_ptr));

有干净的方法吗?

编辑 - task_ptr 是函数指针void task_ptr(void)

Love Barmar 的回答消除了我的便携性缺点。此外,void 指针数组实际上比无符号整数更有意义。谢谢 Barmar 和 isaach1000。

编辑 2:知道了,我的编译器正在考虑大内存模型,所以它使用的是 32 位指针,而不是我期望的 16 位指针(总内存为 17K 的小型微控制器)。

4

3 回答 3

4

C 样式的铸件可以将八角钉安装到梯形孔中,所以我会说,鉴于您非常具体的目标硬件和要求,我会使用该铸件,可能会包裹在模板中以提高清晰度。

或者,双重转换为void*thenint确实具有使代码像大拇指一样突出的优势,因此您的未来维护人员知道正在发生的事情并可以特别注意。

编辑评论:看来您的编译器可能有错误。以下代码在 g++ 4.5 上编译:

#include <iostream>

int f()
{
    return 0;
}

int main()
{
    int value = (int)&f;

    std::cout << value << std::endl;
}

EDIT2:您可能还希望考虑使用intptr_ttype 而不是int. 它是一个大到足以容纳指针的整数类型。

于 2013-05-06T15:12:39.620 回答
2

在 C++ 中,可以将指针转换为足以容纳它的整数类型的值。定义了条件支持的类型std::intptr_t,以便您可以将 a 转换void*intptr_t和返回以获取原始值。如果void*大小等于或大于您平台上的函数指针,那么您可以通过以下方式进行转换。

#include <cstdint>
#include <cassert>

void foo() {}

int main() {
    void (*a)() = &foo;

    std::intptr_t b = reinterpret_cast<std::intptr_t>(a);

    void (*c)() = reinterpret_cast<void(*)()>(b);
    assert(a==c);
}
于 2013-05-06T17:27:32.453 回答
-1

这是符合 ansi 的:

int MyFunc(void* p)
{
    return 1;
}

int main()
{
   int arr[2];
   int (*foo)(int*);

   arr[0] = (int)(MyFunc);

   foo = (int (*)(int*))(arr[0]);

   arr[1] = (*foo)(NULL);
}
于 2013-05-06T16:19:02.717 回答