在這裏,我們有一組C宏,用於使用預處理器執行位域操作,並且在Visual Studio中嘗試使用這些宏時會遇到警告。這個問題可以很容易地證明:位域掩碼計算宏
#define BITFIELD_WIDTHMASK(Width) \
((Width) >= 32 ? ~0x0ul : (1ul << (Width)) - 1)
unsigned long foo(void)
{
return BITFIELD_WIDTHMASK(32);
}
與MSVC編譯此產生了警告:
test.c(12) : warning C4293: '<<' : shift count negative or too big, undefined behavior
這是不是一個行爲問題 - <<
運營商將不會在這種情況下使用,這應該在編譯時檢測到。但是,有沒有人有任何關於如何重寫宏以避免警告的建議?或者,如果失敗了,如何爲此重新設計宏接口?
預先感謝
工作,並且乾淨而緊密。到底是什麼我以後。謝謝! – 2010-05-04 22:37:28
當寬度是常數時,這是有效的。但是,如果它是一個變量,那麼它的運行效率可能會低於一個班次,如果這很重要的話。仍然;涵蓋了所有的基礎。 +1。 – Clifford 2010-05-04 22:48:54