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のように)?

4

1 に答える 1

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つのエラーメッセージのみ!)が生成されます。

于 2012-02-22T15:33:13.987 に答える