我有一個size_t
類型的變量,我想用printf()
打印它。 我使用什麼格式說明符來便攜地打印它? visual-studio
在32位機器中, %u
彷佛是正確的。 我用g++ -g -W -Wall -Werror -ansi -pedantic
,沒有任何警告。 可是當我在64位機器中編譯該代碼時,它會產生警告。 spa
size_t x = <something>; printf( "size = %u\n", x ); warning: format '%u' expects type 'unsigned int', but argument 2 has type 'long unsigned int'
正如預期的那樣,警告會消失,若是我將其更改成%lu
。 code
問題是,如何編寫代碼,以便在32位和64位機器上編譯警告? orm
編輯:做爲一種解決方法,我想一個答案多是將變量「轉換」爲一個足夠大的整數,好比unsigned long
,並使用%lu
打印。 這在兩種狀況下都有效。 我在尋找是否還有其餘想法。 blog
在某些平臺上,對於某些類型,能夠使用特定的printf轉換說明符,但有時必須使用轉換爲更大的類型。 字符串
我在這裏記錄了這個棘手的問題,例如代碼: http : //www.pixelbeat.org/programming/gcc/int_types/並按期更新它,並提供有關新平臺和類型的信息。 get
printf("size = %zu\n", sizeof(thing) );
若是你將32位無符號整數傳遞給%lu格式,它會警告你嗎? 它應該沒問題,由於轉換是明肯定義的,不會丟失任何信息。 編譯器
我據說有些平臺在<inttypes.h>
中定義了你能夠插入到格式字符串文字中的宏,但我在Windows C ++編譯器上看不到那個標題,這意味着它可能不是跨平臺的。 string
std::size_t s = 1024; std::cout << s; // or any other kind of stream like stringstream!
看起來它取決於您正在使用的編譯器(blech): io
%zu
(或%zx
,或%zd
但顯示它就好像已簽名等) %Iu
(或%Ix
,或%Id
但再次簽名等) - 但從cl v19開始(在Visual Studio 2015中),Microsoft支持%zu
(請參閱此評論的 回覆 ) ...固然,若是你使用的是C ++,你能夠使用cout
代替AraK的建議 。