簡體   English   中英

C ++:從“常量變量*”轉換為“ uint32”會失去精度

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM