2011-07-10 9 views
1

を持っていない私は、次のコードを持っていると私はそれをコンパイルしようとしているとき、私はエラーを取得する:にはメンバーのコンパイルエラー

error: ‘list_item_t’ has no member named ‘state’

どれ創造的なアイデアのコードのこの部分を作る方法を、警告やerrosなしでコンパイル?

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

答えて

2

_DEBUG_が定義されている場合に限り、あなたのクラスに記載されているメンバーがあり、明らかにそうではありません。あなたのTUまたは変更プロジェクト設定の初めに

#define _DEBUG_

他のいくつかの方法でそれを定義する

+0

あなたは正しいです。これは、_DEBUG_を使用してコンパイルする必要があります。私が経験する問題は、_DEBUG_が設定されていない場合です。 – alnet

2

これは

p_list_item.state == 0を評価し、これに存在する stateを必要
#define ASSERT(exp) ((void)(exp)) 

によるものです_DEBUG_#define 'でない場合でも

+0

_DEFINE_ = 1と_DEFINE_ = 0の両方の場合にこのコードをコンパイルします。 – alnet

+0

@alnet:無条件に 'state'メンバに入れるか、' #ifdef _DEBUG_'ブロックの中で 'ASSERT'だけを使うべきです。注意、btw。、 '_'で始まるマクロと大文字を定義してはいけません。そのような名前は、C実装が内部的に使用するために予約されています。 –

3

だけ#defineASSERTASSERTは、もはやその引数を評価しますが、それは、人々はそれがとにかく動作するように期待してどのようなので、これは他のコードスポットの動作を変更しないことを

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

注意など。

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

+0

これを実行すると、 '警告:未使用変数 'p_list_item' [-Wunused-variable]' – alnet

+0

を取得しました。これを使用しなかったので、 '_DEBUG_'ガードを' p_list_item' 。 –

+1

@ainet予想通り、\ _DEBUG \ _が定義されていない限り、あなたのコードはp_list_itemを使用しません。 ASSERTマクロを変更するだけでは何もできません。 – nos