2011-02-10 360 views
4

在我的C代碼中,我是fprintf ing "%lu"並給出了相應字段的uint32_t。但是,當我與-Wall編譯GCC,我得到以下警告(版本4.2.4):關於printf()的編譯器警告long unsigned int和uint32_t

writeresults.c:16: warning: format '%4lu' expects type 'long unsigned int', but argument 2 has type 
`uint32_t' 

不是uint32_tlong unsigned int在32位架構是一回事嗎?如果不刪除-Wall編譯器開關或使用類型轉換(如果是,如何),可以避免此警告嗎?

是的,我仍然在使用32位計算機/ arch/OS /編譯器(目前太窮而無法購買新的64位硬件)。謝謝!

+0

真正的問題:「我如何獲得GCC到*不*警告在{%長d},在一些機器上長= = int,因爲出於某種原因(可能是MS compat),int32_t在機器上被定義爲long而不是int,並且人們堅持要在任何地方使用int32_t,而且我真的不想把(int)放在每個單一的東西傳遞給printf「。 – greggo 2017-09-20 18:38:18

回答

9

uint32_t x86上的Linux與GCC只是unsigned int。因此,使用fprintf(stream, "%4u", ...)(無符號整型)或更好,fprintf(stream, "%4" PRIu32, ...)(的inttypes.h printf字符串說明符)。

後者肯定會消除編譯器警告/錯誤,另外還是跨平臺的。

+0

呃,你指的是什麼「不好」的角色? `PRIu32` *是正確處理`uint32_t`的定義。 – 2011-03-17 22:50:48

+0

哦,我是,你是對的!我錯了。謝謝。我會刪除我的評論。 – vy32 2011-03-18 04:40:11

1

「long int」和「int」在C++中是不同的類型。您可能正在尋找「u」格式,即「unsigned int」。當然,這取決於什麼「uint32_t」是你的編譯器的typedef。

+0

在它們大小相同的情況下,編譯器意識到這一點,因此它可以知道(「%d」,(long)x)將正常工作,但它會警告您,因爲該構造不會在其他機器。當然,除非'long'確實是int32_t typedef,在這種情況下,它可以在int = 32位的任何機器上工作。我更喜歡是否有辦法解決這個問題,並且只會警告在當前情況下真*錯的事情。 – greggo 2017-09-20 18:45:00

4

可靠地抑制警告的最簡單的方法是用鑄造:

 
printf("%lu", (unsigned long)x);