c++:从“const variable*”转换为“uint32”会丢失精度

c++:从“const variable*”转换为“uint32”会丢失精度,c++,c,casting,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; 及 以上代码在gcc编译器中编译。 但是,当我包含externC{}时,将文件另存

我有两个结构rom和transfer

    typedef struct
    {
    const uint32 data;
    }rom;

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

    extern const transfer num;
在另一个C程序中,我声明

transfer* count;

以上代码在gcc编译器中编译。 但是,当我包含externC{}时,将文件另存为.cpp,并使用g++编译器编译时,它会抛出一个错误。因为直接类型转换在g++编译器中是不可能的。错误是

错误:从“const transfer*”强制转换为“uint32{{aka unsigned int}” 失去精度[-F允许]


<>我们如何才能为C++编译器打字?

这行有很多错误。

不要使用家庭酿造的整数类型。使用STDITN.H/CSTDIN。即UTI32 32 t而不是UIT32。这是C和C++两者都适用的。 uint32_t或其自制的等价物不能保证能够保存指针的值。这可能是编译器消息的来源。相反,您应该使用uintptr_t.,可以在stdint.h/cstdint中找到。 也许这个问题不是那么多的C和C++,就像一个编译器运行64位地址,而不是另一个地址,或者一些这样的。 *uTIN 32×T*& FaseStutt是C和C++中的一个严格的混叠破坏。 如果结构的成员中包含uint32_t,则可以从uint32_t转换为结构类型,反之亦然

如果您不知道“偶数”是什么意思,请不要像这样进行任意指针转换,这是未定义的行为。特别是,不要在gcc/g++上这样做,因为如果您这样做,它往往会发疯。正式地说,它有权按照标准发疯


那一行错得太多了

不要使用家庭酿造的整数类型。使用STDITN.H/CSTDIN。即UTI32 32 t而不是UIT32。这是C和C++两者都适用的。 uint32_t或其自制的等价物不能保证能够保存指针的值。这可能是编译器消息的来源。相反,您应该使用uintptr_t.,可以在stdint.h/cstdint中找到。 也许这个问题不是那么多的C和C++,就像一个编译器运行64位地址,而不是另一个地址,或者一些这样的。 *uTIN 32×T*& FaseStutt是C和C++中的一个严格的混叠破坏。 如果结构的成员中包含uint32_t,则可以从uint32_t转换为结构类型,反之亦然

如果您不知道“偶数”是什么意思,请不要像这样进行任意指针转换,这是未定义的行为。特别是,不要在gcc/g++上这样做,因为如果您这样做,它往往会发疯。正式地说,它有权按照标准发疯


将指针强制转换为整数,对该整数执行算术运算,然后再强制转换回指针是未定义的行为。即使对于intptr\t也是如此。执行指针算术的唯一方法是直接对指针执行


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

将指针转换为整数,对该整数执行算术,然后再转换回指针是未定义的行为。即使对intptr__t也是如此。执行指针算术的唯一方法是直接在指针


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

真正的问题是,为什么您认为可以尝试将结构的地址填充到uint32中,向其中添加一些值,然后尝试将其作为指向32位无符号int值(a)的指针取消引用然后将结果视为指向结构的指针。即使指针总是适合32位无符号int值,但它不适合…,严格的别名冲突也比比皆是。除了令人费解的混乱之外。真正的问题是,为什么您认为可以尝试将结构的地址填充到uint32中,添加一些值to它,然后尝试将其作为指向32位无符号int值的指针取消引用-然后将结果视为指向结构的指针。即使指针总是适合32位无符号int值,但它不…,严格的别名冲突也比比皆是。这是一个不可理解的混乱。我不认为这是真的。如果你将一个整数返回到指针,指针恰好是指向某个对象的指针,或者最终为空ptr,行为已经定义。但是@Lundin是这方面的专家,让我们看看他们是否有评论。你唯一可以依赖的是将其转换为intptr\t,然后再转换回指针,而不需要对intptr\r进行任何运算。我不知道这是真的。如果你把一个整数转换回指针,而指针恰好指向某个东西,或者最终是null ptr,那么行为是被定义的。但是@Lundin是这方面的专家,让我们看看他们是否有评论。你唯一可以依赖的是,将其转换回int ptr\t,然后再转换回指针,而不做任何算术运算intptr_r上的ic。
count = (transfer*)(*((uint32*)((uint32)&num) + 2*seqno));