[英]C++ Cast from ‘std::__tuple… {aka ‘unsigned int*’} to ‘uint32_t’ {aka ‘unsigned int’} loses precision
[英]c++: cast from “const variable*” to “uint32” loses precision
我有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 *'轉換為'uint32 {{aka unsigned int}''失去精度[-fpermissive]
我們如何為C ++編譯器進行類型轉換?
該行有很多錯誤。
stdint.h
/ cstdint
。 也就是uint32_t
而不是uint32
。 這適用於C和C ++。 不保證uint32_t
或其本地等效項能夠保存指針的值。 這可能是編譯器消息的來源。 相反,您應該使用uintptr_t
。 可以在stdint.h
/ cstdint
找到。
(也許問題不在於C與C ++的關系,因為一個編譯器使用64位地址,而其他編譯器則不使用64位地址)。
*(uint32_t*)&some_struct
在C和C ++中都是嚴格的別名沖突。
(碰巧的是,如果結構在其成員中包含uint32_t
,則可以從uint32_t
轉到結構類型,反之則不行。)
如果您不知道嚴格的別名甚至意味着什么,只需不執行此類的野指針轉換,這就是未定義的行為。 特別要注意的是,不要在gcc / g ++上執行此操作,因為如果這樣做的話,它往往會發瘋。 (根據標准,它有權利發瘋……)
將指針轉換為整數,對該整數進行算術運算,然后再轉換回指針是未定義的行為。 即使對於intptr_t
也是如此。 進行指針算術的唯一方法是直接在指針上。
這是因為指針值和intptr_t值之間的映射是實現定義的,並非強制要求它們相同。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.