在同一行中鑄造兩次
我在專案中看到這個程式碼.
b的型別是void *:
void *b = ...; int a = (int) (unsigned long) b;
這條線是否無意義?我的意思是,它在所有情況下與a((int)b相同)
這可能避免了64位Unix系統上的編譯器警告,其中unsigned long是64位數量,因此足夠大以容納一個指標,但int是一個32位數量,不足以容納一個指標.轉換為(無符號長)保留地址的所有位;隨後的轉換為int會丟擲地址的高位32位,但是預設情況下不會發出警告.
展示:
int main(void) { void *b = (void *)0x12345678; inta = (int)(unsigned long)b; intc = (int)b; return a + c; } $gcc -O3 -g -std=c99 -Wall -Wextra -c ar.c ar.c: In function ‘main’: ar.c:5:15: warning: cast from pointer to integer of different size [-Wpointer-to-int-cast] $
在Mac OS X 10.8.4上使用GCC 4.7.1,預設為64位編譯.
有趣的是推測用“地址的一部分”值來做什麼.
程式碼日誌版權宣告:
翻譯自:http://stackoverflow.com/questions/17161029/casting-twice-in-the-same-line