如何使用printf系列便攜地打印size_t變量?

我有一個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'

正如預期的那樣,警告會消失,若是我將其更改成%lucode

問題是,如何編寫代碼,以便在32位和64位機器上編譯警告? orm

編輯:做爲一種解決方法,我想一個答案多是將變量「轉換」爲一個足夠大的整數,好比unsigned long ,並使用%lu打印。 這在兩種狀況下都有效。 我在尋找是否還有其餘想法。 blog


#1樓

在某些平臺上,對於某些類型,能夠使用特定的printf轉換說明符,但有時必須使用轉換爲更大的類型。 字符串

我在這裏記錄了這個棘手的問題,例如代碼: http//www.pixelbeat.org/programming/gcc/int_types/並按期更新它,並提供有關新平臺和類型的信息。 get


#2樓

printf("size = %zu\n", sizeof(thing) );

#3樓

若是你將32位無符號整數傳遞給%lu格式,它會警告你嗎? 它應該沒問題,由於轉換是明肯定義的,不會丟失任何信息。 編譯器

我據說有些平臺在<inttypes.h>中定義了你能夠插入到格式字符串文字中的宏,但我在Windows C ++編譯器上看不到那個標題,這意味着它可能不是跨平臺的。 string


#4樓

std::size_t s = 1024;
std::cout << s; // or any other kind of stream like stringstream!

#5樓

看起來它取決於您正在使用的編譯器(blech): io

  • gnu說%zu (或%zx ,或%zd但顯示它就好像已簽名等)
  • 微軟表示%Iu (或%Ix ,或%Id但再次簽名等) - 但從cl v19開始(在Visual Studio 2015中),Microsoft支持%zu (請參閱此評論的 回覆

...固然,若是你使用的是C ++,你能夠使用cout代替AraK的建議

相關文章
相關標籤/搜索