c ++:来自" const变量*"到" uint32"失去精确度

时间:2018-06-08 12:51:17

标签: c++ c casting

我有两种结构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 ++编译器无法进行直接类型转换。错误是

  

错误:来自' const transfer *' to' uint32 {{aka unsigned int}'   失去精确度[-fpermissive]

我们如何对c ++编译器进行类型转换?

2 个答案:

答案 0 :(得分:4)

那条线上有太多错误。

  • 不要使用自酿整数类型。使用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 ++上这样做,因为如果你这样做,它往往会变得疯狂。 (正式它有权根据标准坚持......)

答案 1 :(得分:0)

将指针转换为整数,对该整数进行算术运算,并且返回指针是未定义的行为。即使intptr_t也是如此。进行指针运算的唯一方法是直接在指针上。

这是因为指针值和intptr_t值之间的映射是实现定义的,并不强制它们是相同的。