私は最近次のコードを見ました:
#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のように)?
私は最近次のコードを見ました:
#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のように)?
それはあなたのために働きますか?
#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つのエラーメッセージのみ!)が生成されます。