簡體   English   中英

指向int的int指針類型

[英]Int pointer type to int

我很難解決VS2013發出的一個警告。 我所擁有的是一段用於將文本傳遞給int var的代碼:

#define WRITE(txt)  { foo->bar.func = func_xyz; foo->bar.xyz.var = (((uint64_t) (uintptr_t) (txt)) & 0xFFFFFFFFu); } //where var is uint32_t

這導致編譯器返回

warning C4244: '=' : conversion from 'uintptr_t' to 'uint32_t', possible loss of data.

現在,很遺憾,我無法將var類型更改為uint32_t以外的任何其他內容,但不幸的是,我成為預處理器指令的受害者

#ifdef  _WIN64
    typedef unsigned __int64    uintptr_t;

有什么辦法可以解決這個警告,並采取正確的方法? 我100%確信這是可以正常工作的(僅因為是這樣),但是任何警告都是不可接受的。

應該再進行一次轉換:

#define WRITE(txt) {                                                             \
    foo->bar.func = func_xyz;                                                    \
    foo->bar.xyz.var = (uint32_t)(((uint64_t) (uintptr_t) (txt)) & 0xFFFFFFFFu); \
} //where var is uint32_t

有什么辦法可以解決這個警告,並采取正確的方法?

如果txt可以是一個指針,並且您打算以一種可以從中恢復指針的形式捕獲它的值,那么不,您做的是天生的錯誤,並且編譯器警告您代碼中有真正的缺陷。 。

uintptr_t是一個無符號整數類型,其寬度足以容納任何轉換為​​整數的指針的值。 在win64中,指針可以大於32位,因此uintptr_t必須更寬。 (而且您不是那種“受害者”,該類型被標准指定為具有這些特征。)沒有伏都教可以使任意64位值適合32位。

我100%確信這是可以正常工作的(僅因為是這樣),但是任何警告都是不可接受的。

它可能已經在您的所有測試,特定的測試硬件,特定的測試方案甚至工作中都起作用。 這並不意味着它是正確的,也不意味着它可以在其他硬件或其他輸入上可靠地工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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