在C ++中投射函数指针到整数

我有一组无符号整数,需要存储指向数据和函数的指针以及一些数据。 在我使用的设备中,sizeof指针与sizeof 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)

爱巴尔玛的回答,把我的便携性带走了。 同样,void指针的数组实际上更有意义,然后是Unsigned Ints。 谢谢Barmar和isaach1000。

编辑2:明白了,我的编译器正在考虑大内存模型,所以它使用的是32位指针,而不是我期待的16位指针(带有17K总内存的小型微型指针)。


一个C型铸件可以将一个八边形钉固定到一个梯形孔中,所以我会说,鉴于您的特定目标硬件和要求,我会使用该铸件,可能会将其包裹到模板中以便更清晰。

或者,双重抛出void*然后int具有让代码脱颖而出的优点,使得你的未来维护者知道正在发生的事情并且可以特别关注。

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

#include <iostream>

int f()
{
    return 0;
}

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

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

编辑2:你也可以考虑使用intptr_t类型而不是int 。 这是一个足以容纳指针的整数类型。


在C ++中,一个指针可以被转换为一个足够大的整数类型的值来保存它。 有条件支持的类型std::intptr_t被定义为可以将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);
}

这是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);
}
链接地址: http://www.djcxy.com/p/73207.html

上一篇: Casting Function Pointer to Integer in C++

下一篇: CppUTest: how to pass more data to a specific mock call?