假設我有類似下面的功能:如何使特定的「無符號無符號比較零」警告消失?
#define LOWER_BOUND 0
#define UPPER_BOUND 42
int is_value_in_range(some_typedef val)
{
return ((LOWER_BOUND <= val) && (val <= UPPER_BOUND));
}
假設我已經配置了適當的警告,如果some_typedef
原來是一個無符號的類型,我會得到一個警告,有一個無符號類型的無意義的比較與0.當然這是真的,它是有道理的。
但是,可以說,我做要針對零檢查是在一個或多個可能的原因,如代碼:
- 雖然界限總是會編譯時間常數,它們可能會改變(並且宏可能不會「活」到非常接近該函數)。例如,可以通過將選項傳遞給編譯器來設置邊界。
- 我可能希望防止將typedef稍後更改爲signed類型,因爲typedef的每次使用可能在更改時都沒有仔細檢查。
是否有一個體面,合理的便攜式的方式來沉默警告,而不是完全關閉它?
某些依賴於'STATIC_ASSERT()'類似的功能(可用於我)將是可以接受的,如果它是合理的。如果類型更改爲強制某人查看代碼,那麼我可以打破編譯。但是可能很重要的一點是,typeof
不是我在所有我所針對的編譯器中可用的東西。
我專門找C語言的解決方案,所以模板是不是在這裏的任何使用...
如果您對編譯器特定的方法開放,那麼您應該指定您的編譯器(或編譯器)...... – AnT 2011-06-06 23:44:09
特定於編譯器與「合理便攜」不兼容。 – 2011-06-06 23:46:39
我正在尋找'合理的便攜式',但是我應該指定編譯器,因爲我可能能夠使用預處理器來適應某些'足夠好'的工作:IAR,MSVC和GCC是我感興趣的。 – 2011-06-06 23:58:47