2011-07-26 56 views
1

我想做到以下幾點,但是編譯器不喜歡它:條件編譯和編譯表達式時評價ANSI C

unsigned short foo = 1; 
// do something with foo 
#if sizeof(short) * CHAR_BIT > 16 
    foo &= 0xffff; 
#endif 

我知道這個表情總是可以在編譯時完全計算,但也許它只是在預處理器完成之後才進行評估?這在ANSI C中是可行的還是我只需要在運行時進行檢查?

+0

沒有標準的方法來通過預處理器詢問數據類型的大小。但也許你對數據類型的重要位數更感興趣?那麼你根本不應該使用'short',而是遵循@larsmans的建議並使用適當的數據類型。對於至少有16個有效位的類型,真正正確的是'int_least16_t'。 –

回答

5

在預處理器表達式中不能使用sizeof。您可能希望做這樣的事情,而不是:如果你的目標是制止編譯時數據類型是錯誤的大小

#include <limits.h> 

#if SHRT_MAX > 32767 
    /* do soemthing */ 
#endif 
+1

或使用'int16_t'。 +1。 –

+1

+1,儘管這不完全正確,因爲OP要求的是數據類型的大小而不是其寬度。理論上,'short'可能有很多填充位。然後原始表達會觸發,你的表達不會。 –

+0

@larsmans:不能這樣做,它是ANSI C. int16_t,所有其他特定的寬度類型都是C99的一部分。 –

5

,下面的技術是有用的:

struct _check_type_sizes 
{ 
    int int_is_4_bytes[(sizeof(int) == 4) ? 1 : -1]; 
    int short_is_2_bytes[(sizeof(short) == 2) ? 1 : -1]; 
}; 

(sizeof運算( )函數在此由編譯器解釋,而不是預處理器。)

此方法的主要缺點是編譯器錯誤不是很明顯。確保你寫了一個非常明確的評論。

+0

+1,用於使用編譯時斷言的良好解決方案。 –

+0

+1創造力。這將與表達式'sizeof(short)* CHAR_BIT> 16'一起使用嗎?僅僅因爲short是2個字節並不意味着它是16位。 ANSI C只保證字節至少爲8位,但它們可能更多。例如,有9位字節的體系結構。 –