2011-07-10 96 views
1

我有下面的代碼,當我試圖編譯它,我得到一個錯誤:沒有成員編譯錯誤

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

任何創意如何讓這段代碼編譯沒有警告和錯誤回報?

#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_被定義,它顯然不是。

#define _DEBUG_

在你的TU或更改項目設置開始

在一些其他的方式把它定義

+0

你說得對。這應該用_DEBUG_集進行編譯並且不帶它。我遇到的問題是_DEBUG_未設置。 – alnet

2

這是由於

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

,其評價p_list_item.state == 0,因此需要state存在即使當_DEBUG_不是#define'd。

+0

當_DEFINE_ = 1和_DEFINE_ = 0 – alnet

+0

@alnet時,我希望這段代碼能夠編譯這兩種情況:那麼你應該無條件地放入'state'成員,或者只在'#ifdef _DEBUG_'塊中使用'ASSERT' 。注意,順便提一句,你不應該定義以'_'開頭的宏和一個大寫字母。這些名稱保留供C實現內部使用。 –

3

#defineASSERT作爲

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

注意,這可能會改變其他代碼點的行爲,因爲ASSERT不再評估它的參數,但是這就是人們期待它的表現呢。

或執行_DEBUG_構建,但這並不能解決問題,它只是避免它。

+0

當我這樣做時,我得到'warning:未使用的變量'p_list_item'[-Wunused-variable]' – alnet

+0

因爲你沒有使用它 - 你可以通過在'p_list_item'聲明中放置另一個'_DEBUG_'來解決它。 。 –

+1

@ainet這是預期的,你的代碼不會使用p_list_item,除非定義了\ _DEBUG \ _。只需更改ASSERT宏,您無法做任何事情。 – nos

相關問題