2012-02-22 6 views
0

私は最近、次のコードを見ました:(BOOST_STATIC_ASSERTのような)予想通りこの静的なアサートは正しいですか?

#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)) } 

それは動作しますか?

+0

どのように使用しようとしているかを教えて、より正確な質問をすることができます。このように、 'msg'パラメータは使用されません。これは変です。 –

+2

'static_assert'の何が問題なのですか? –

+0

MSVC 2010では動作しません。コンパイラは、 'e'として0を渡すと' 1/int(!!(e)) 'が定数であることを検出できません。 –

答えて

1

あなたのために働くでしょうか?

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

式に応じて、サイズ1または0の配列を宣言しようとしています。 GCCはゼロサイズの配列(デフォルトで)を許可するので、VC上でのみ動作します。 2番目の使用法は、変数を使用するちょうどであるため、コンパイラは「未使用変数」警告を出さないようにします。 バックスラッシュ(\)の後に空白がなく、VC上で動作することに注意してください。単一行マクロに変更するか、コンパイラで適切な代替方法を使用してください。

代わりにstatic_assertを使用することをお勧めします。これにより、優雅なエラーメッセージが表示されます(エラーメッセージは1つだけです)。

関連する問題