我正在尝试了解一些C ++功能并编写了一些测试。但是,当我尝试编译时,我收到以下错误(如下)。为什么会发生这种情况,以及正确的方法是什么?我正在尝试将32位指针转换为8位指针,并在转换后打印出内容。
cast3.cpp:22:错误:不能用dynamic_cast'bigptr'('uint32_t *'类型)来输入'uint8_t *'(目标不是指针或对类的引用)
代码:
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void castme(uint8_t small[], int size);
int main(void)
{
uint8_t *small;
uint32_t big = 0x01234567;
uint32_t *bigptr = &big;
small = dynamic_cast<uint8_t *>(bigptr); // Line 22
castme(small, sizeof(big));
return 0;
}
void castme(uint8_t small[], int size)
{
for (int i = 0; i < size; i++)
{
printf("0x%x\n", small[i]);
}
}
答案 0 :(得分:6)
dynamic_cast
仅适用于具有虚拟成员函数的类。要在彼此之间转换原始指针类型,您需要reinterpret_cast
。
答案 1 :(得分:3)
您正在使用错误的演员。 dynamic_cast
仅适用于多态类类型,因为它在运行时执行RTTI查找。您没有在代码中使用多态类类型。要简单地将一个指针类型视为另一个指针类型,您需要使用reinterpret_cast
代替:
small = reinterpret_cast<uint8_t *>(bigptr);
答案 2 :(得分:1)
要编译代码,您可以执行以下操作:
small = reinterpret_cast<uint8_t *>(bigptr);
但是我不会这样做,你应该取消引用uint32_t指针然后转换为你想要的类型 - 在我的脑海里没有任何关注uint8_t指针。
即。
uint8_t small_one = *bigptr;
答案 3 :(得分:0)
使用reinterpret_cast。 dynamic_cast有不同的目的。