c++ - void* 数组将元素转换为另一种类型

标签 c++ x86-64 data-conversion void-pointers

我有这样的东西:

void* a[] = {(void*)"Hello",(void*)1};
cout << (char*)a[0] << endl;
cout << (int)(int64_t)((int*)a[1]) << endl;

如何简化线条 (int)(int64_t)((int*)a[1])

是否可以更容易地将 void * 更改为 int?

最佳答案

void* a[] = {static_cast<void*>(const_cast<char*>("Hello")),reinterpret_cast<void*>(static_cast<omyptr_t>(1))};
std::cout << static_cast<char*>(a[0]) << std::endl;
std::cout << static_cast<int>(reinterpret_cast<intptr_t>(a[1])) << std::endl;

我认为这是所有已定义的行为。

void* 转换时总是转换回完全相同的状态。避免使用原始 C 类型转换,因为它可以是静态类型转换、常量类型转换或重新解释类型转换,做错一个真的会破坏事情。

考虑使用 std::anyboost::any 而不是原始的 void 指针;或变体,如果您知道要存储的一组固定类型。

关于c++ - void* 数组将元素转换为另一种类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51774312/

相关文章:

c++ - 如何使用内联汇编在 C/C++ 程序中调用 DOS 中断?

c++ - 将 std::string 解释为 char_type 的 std::vector?

assembly - 是否可以暂时抑制单个 ret 指令的 Intel CET,或者以其他方式使用 retpolines?

java - 使用 Java 中的 TableSource、Table 或 DataSet 对象将 String 转换为 Double

python - 用 C++ 绘制图形

c++ - Boost tokenizer 将引用的字符串视为一个标记

linux - 为什么 yasm 生成不正确的调试信息?

macos - 非法指令 : 4 (Mac 64-bit, NASM)

python - 转换数据框中(pandas/Python)中的系列,其中列是系列的级别

annotations - 将 Yolov5 bbox 导出为 Pascal 格式