gpt4 book ai didi

c++: 从 "const variable*"转换为 "uint32"失去精度

转载 作者:太空宇宙 更新时间:2023-11-04 01:18:23 26 4
gpt4 key购买 nike

我有两个结构 rom 和 transfer。

    typedef struct
{
const uint32 data;
}rom;

typedef struct
{
const rom* const read;
}transfer;

extern const transfer num;

在我声明的另一个 C 程序中

transfer* count;

count = (transfer*)(*((uint32*)((uint32)&num) + 2*seqno));

以上代码在 gcc 编译器中编译。但是当我包含 extern "C"{} 时,将文件另存为 .cpp 并使用 g++ 编译器构建它会抛出一个错误。由于 g++ 编译器无法进行直接类型转换。错误是

error: cast from 'const transfer*' to 'uint32{{aka unsigned int}' loses precision [-fpermissive]

我们如何为 C++ 编译器进行类型转换?

最佳答案

那一行错得太多了。

  • 不要使用自制的整数类型。使用 stdint.h/cstdint。也就是说,uint32_t 而不是 uint32。这适用于 C 和 C++。
  • uint32_t 或其自制的等效项不能保证能够保存指针的值。这可能是编译器消息的来源。相反,您应该使用 uintptr_t。可在 stdint.h/cstdint 中找到。
    (也许问题不在于 C 还是 C++,因为一个编译器使用 64 位地址而不是另一个,或者类似的。)

  • *(uint32_t*)&some_struct 在 C 和 C++ 中都是严格的别名违规。
    (如果结构在其成员中包含 uint32_t,那么您可以从 uint32_t 转到结构类型,但反之则不然。)

    如果你不知道是什么strict aliasing甚至意味着,简单地不要像这样进行野指针转换,这是未定义的行为。特别是,不要在 gcc/g++ 上这样做,因为如果这样做,它往往会发疯。 (正式它有权按照标准发疯......)

关于c++: 从 "const variable*"转换为 "uint32"失去精度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50761079/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com