1

次のコードがあり、コンパイルしようとするとエラーが発生します。

エラー: 'list_item_t' には 'state' という名前のメンバーがありません</p>

このコードを警告やエラーなしでコンパイルするための創造的なアイデアはありますか?

 #if defined (_DEBUG_)
 #define ASSERT       assert
 #else                           /* _DEBUG_ */
 #define ASSERT( exp ) ((void)(exp))
 #endif`

typedef struct list_item {
        struct list_item *p_next;
        struct list_item *p_prev;
 #ifdef _DEBUG_
        int state;
 #endif
 } list_item_t;

main(int argc, char *argv)
{
    list_item_t p_list_item;

    ASSERT(p_list_item.state == 0);
}
4

3 に答える 3

3

そのまま#define ASSERT_

 #if defined (_DEBUG_)
 #define ASSERT       assert
 #else                          
 #define ASSERT( exp ) (void)0
 #endif

ASSERTこれにより、引数が評価されなくなったため、他のコード スポットの動作が変わる可能性があることに注意してください。

または_DEBUG_ビルドを実行しますが、これは問題を解決せず、問題を回避するだけです。

于 2011-07-10T14:11:57.500 に答える
2

が定義されている場合にのみ、クラスには言及されたメンバーがあり _DEBUG_、明らかにそうではありません。

#define _DEBUG_

TU の最初に追加するか、プロジェクト設定を変更して別の方法で定義します

于 2011-07-10T14:10:48.290 に答える
2

これは、に起因するものです

#define ASSERT( exp ) ((void)(exp))

これは評価されるため、 is 'dでない場合でも存在するp_list_item.state == 0必要があります。state_DEBUG_#define

于 2011-07-10T14:11:56.340 に答える