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))

它进行评估p_list_item.state == 0,因此state即使_DEBUG_不是#define'd 也需要存在。

于 2011-07-10T14:11:56.340 回答