2012-02-22 43 views
0

我最近看到下面的代碼:這個靜態聲明是否正確工作?

#define MY_ASSERT_CONCAT_(a, b) a##b 
#define MY_ASSERT_CONCAT(a, b) MY_ASSERT_CONCAT_(a, b) 
#define MY_STATIC_ASSERT(e,msg) enum { MY_ASSERT_CONCAT(assert_line_,__LINE__) = 1/int(!!(e)) } 

將它按預期工作(BOOST_STATIC_ASSERT樣)?

+0

你可以做,告訴我們你是怎樣嘗試使用它你的問題更精確。像這樣,msg參數沒有被使用,這很奇怪。 – 2012-02-22 13:37:53

+2

出了什麼問題'static_assert'? – 2012-02-22 13:44:00

+0

它不會在2010 MSVC工作,編譯器不能檢測到'1/INT(!!(e))的'是一個常數當我通過0作爲'e'。 – 2012-02-22 13:45:33

回答

1

它適合你嗎?

#define MY_STATIC_ASSERT(e,msg) \ 
{ \ 
     int MY_ASSERT_CONCAT(assert_line_,__LINE__)[!!e]; \ 
     MY_ASSERT_CONCAT(assert_line_,__LINE__); \ 
} 

它試圖根據表達式聲明大小爲1或0的數組。它只能在VC上工作,因爲GCC允許零大小的數組(默認情況下)。第二個用法是,使用變量,以便編譯器不會發出「未使用的變量」警告。 請注意,反斜槓後面沒有空格(\),它適用於VC。將其更改爲單行宏或在編譯器中使用適當的替代方法。

我推薦使用static_assert代替,這將產生優雅的錯誤信息(和公正的一個錯誤消息!)。