2010-05-28 24 views
7

我剛剛在維基百科上找到該​​代碼。
鏈接:http://en.wikipedia.org/wiki/Sizeof#Use這是一個正確的語法(在維基百科上找到c代碼)?

代碼:

/* the following code illustrates the use of sizeof 
* with variables and expressions (no parentheses needed), 
* and with type names (parentheses needed) 
*/ 

char c; 

printf("%zu,%zu", sizeof c, sizeof(int)); 

它指出:「在Z字頭應該用來打印出來,因爲實際的大小可以在每個架構是不同的。」

我想它在我的編譯器,但它提供了以下結果:

「祖,祖」

回答

7

是的,這句法是(至少對於C99)是正確的。看起來你的編譯器沒有被設置來處理它。只要拿出z,你可能會好起來的。要正確,請確保您的printf格式說明符與類型的大小相匹配。打開你的編譯器給你的所有警告可能在這方面有所幫助。

你報:

的Z字頭應該用來打印出來,因爲實際的大小可以在每個架構

指的是這樣的事實不同的是size_t(這是該類型由運營商sizeof返回)可以因架構而異。 z旨在使您的代碼更具可移植性。但是,如果你的編譯器不支持它,那不會奏效。只需撥動%u,%lu等組合,直到您獲得有意義的輸出。

+0

+1 for -Wall ... – jcolebrand 2010-05-28 16:22:08

+2

您可以使用'%lu'並明確地將'sizeof'值轉換爲'unsigned long' - 只要您知道對象的大小小於4GB,那麼您知道它肯定會被正確報告。 – caf 2010-05-29 13:44:49

6

將長度修飾符z添加到C中的C99標準;你可能有一個不支持C99的編譯器。

如果你的C編譯器不支持,你或許可以把大小爲unsigned long類型:

printf("%lu,%lu", (unsigned long)sizeof c, (unsigned long)sizeof(int)); 
1

你有沒有告訴您希望它與C99的大腦思維你的編譯器?可能會有一個轉換器來做到這一點。例如,用於gcc的-std=c99

如果你的編譯器不支持它,但你知道別人會,你可以做一個周圍風格PRId64工作(免責聲明 - AHEAD僞代碼..):

#ifdef __SOME_KNOWN_C99_COMPILER 
#define PORTUNSIGNED "zu" 
#else 
#define PORTUNSIGNED "u" 
#endif 

printf("%-11" PORTUNSIGNED " ways to skin a cat\n"); 

它可能更好地得到一個編譯器但是,它具有對c99的功能支持。

+2

預處理器不是邪惡的。 – 2010-05-28 16:37:15

+2

@喬治:這不是普遍的觀點。 – 2010-05-28 19:15:47

+0

@George - 我不是說它的邪惡,我只是說,一些人停止使用它,並開始即興創作,這導致了其他人最終必須保持的有趣的事情:) – 2010-05-29 02:34:57

2

是的,但它只適用於C99兼容的編譯器。從wikipedia

Z:對於整數類型,導致printf的期望一個爲size_t大小的整數參數。

0

我已經使用gcc 4.0進行了測試。它適用於-std=c99