投射函数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总内存的小型微型指针)。

+1

你不能让数组成为void指针数组吗? – isaach1000 2013-05-06 15:07:51

+4

如何使用函数指针和数据指针的联合? – Barmar 2013-05-06 15:09:45

+1

只要(a)整数类型足够大并且(b)它是一个指向普通(非成员或静态成员)函数的指针,一个简单的'reinterpret_cast'应该工作。这是这种情况吗?什么是'task_ptr'? – 2013-05-06 15:20:34

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。这是一个足以容纳指针的整数类型。

+0

当我使用C风格转换时,C++编译器返回一个错误: '错误[Pe171]:无效类型转换' – user1135541 2013-05-06 16:25:56

+1

+1对'intptr_t' – Oktalist 2013-05-06 18:39:23

+1

不幸的是,'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); 
} 
+0

试过了,但我的C++抱怨,'无效类型conversion'。需要做的标准C++方式。 – user1135541 2013-05-06 16:30:04

+0

这在C编译以及++了。你会得到什么确切的错误? – lsalamon 2013-05-06 16:47:15

+3

我最后一次检查,'无效的主要()'是非标准。 – 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); 
} 
+0

即使存在'intptr_t',是否有条件地支持'a'是否可以重新解析为'b'。 (但是,如果存在这种支持,则保证'a == c')。 – 2017-12-13 03:47:37