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