我有两种结构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 ++编译器进行类型转换?
答案 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值之间的映射是实现定义的,并不强制它们是相同的。