在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?