投射函数C++中的整数指针
我有一个无符号整数数组,需要存储指向数据和函数的指针以及一些数据。在我使用的设备中,sizeof指针与sizeof unsigned int相同。我如何将指针转换为无符号整型函数?我知道这使得代码不可移植,但它是微控制器特定的。我尝试这样做:投射函数C++中的整数指针
stackPtr[4] = reinterpret_cast<unsigned int>(task_ptr);
,但它给我一个错误“无效的类型转换”
浇铸成空指针,然后以int是凌乱。
stackPtr[4] = reinterpret_cast<unsigned int>(static_cast<void *> (task_ptr));
有没有干净的做法呢?
编辑 - task_ptr是函数指针void task_ptr(void)
爱Barmar的回答,把我的可移植性的缺点了。同样,void指针的数组实际上更有意义,然后是Unsigned Ints。谢谢Barmar和isaach1000。编辑2:明白了,我的编译器正在考虑大内存模型,所以它使用的是32位指针,而不是我期待的16位指针(带有17K总内存的小型微型指针)。
C型铸件可以将八边形钉固定到梯形孔中,所以我会说,鉴于您非常特定的目标硬件和要求,我会使用该铸件,可能会将其包裹到模板中以便更清晰。
或者,双击到void*
,然后int
的确具有让代码脱颖而出的优点,使您的未来维护者知道正在发生的事情并且可以特别关注。
编辑评论: 看来你的编译器可能有一个bug。下面的代码编译的G ++ 4.5:
#include <iostream>
int f()
{
return 0;
}
int main()
{
int value = (int)&f;
std::cout << value << std::endl;
}
EDIT2: 您也不妨考虑使用intptr_t
类型,而不是int
。这是一个足以容纳指针的整数类型。
当我使用C风格转换时,C++编译器返回一个错误: '错误[Pe171]:无效类型转换' – user1135541 2013-05-06 16:25:56
+1对'intptr_t' – Oktalist 2013-05-06 18:39:23
不幸的是,'intptr_t'没有被指定为允许转换函数指针事情是这样的对对象的指针,有没有类似的函数指针,无论是:-(。所以,有以确保您的代码将无法被编译的系统中的函数指针将不适合在'intptr_t'没有明显的方式。 – SamB 2015-09-23 18:03:49
这是符合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);
}
试过了,但我的C++抱怨,'无效类型conversion'。需要做的标准C++方式。 – user1135541 2013-05-06 16:30:04
这在C编译以及++了。你会得到什么确切的错误? – lsalamon 2013-05-06 16:47:15
我最后一次检查,'无效的主要()'是非标准。 – 2013-05-06 17:03:04
在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);
}
即使存在'intptr_t',是否有条件地支持'a'是否可以重新解析为'b'。 (但是,如果存在这种支持,则保证'a == c')。 – 2017-12-13 03:47:37
你不能让数组成为void指针数组吗? – isaach1000 2013-05-06 15:07:51
如何使用函数指针和数据指针的联合? – Barmar 2013-05-06 15:09:45
只要(a)整数类型足够大并且(b)它是一个指向普通(非成员或静态成员)函数的指针,一个简单的'reinterpret_cast'应该工作。这是这种情况吗?什么是'task_ptr'? – 2013-05-06 15:20:34