【问题标题】:has no member compilation error没有成员编译错误
【发布时间】:2011-07-10 14:07:54
【问题描述】:

我有以下代码,当我试图编译它时,我得到一个错误:

错误:“list_item_t”没有名为“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);
}

【问题讨论】:

    标签: c linux gcc gcc-warning


    【解决方案1】:

    #defineASSERT作为

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

    请注意,这可能会改变其他代码点的行为,因为 ASSERT 不再评估它的参数,但这是人们期望它的行为方式。

    或者执行_DEBUG_ 构建,但这并不能解决问题,它只是避免它。

    【讨论】:

    • 这样做时,我得到warning: unused variable ‘p_list_item’ [-Wunused-variable]
    • 因为您当时没有使用它 - 您可以通过在 p_list_item 的声明周围放置另一个 _DEBUG_ 保护来解决它。
    • @ainet 这是意料之中的,除非定义了 _DEBUG_,否则您的代码不会使用 p_list_item。仅通过更改 ASSERT 宏就无法解决此问题。
    【解决方案2】:

    当且仅当_DEBUG_ 被定义时,您的班级才有提到的成员,而且显然没有。

    #define _DEBUG_

    在 TU 的开头或更改项目设置以以其他方式定义它

    【讨论】:

    • 你是对的。这应该在 DEBUG 设置和没有它的情况下编译。我遇到的问题是未设置 DEBUG 时。
    【解决方案3】:

    这是由于

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

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

    【讨论】:

    • 我希望这段代码在 _DEFINE_=1 和 _DEFINE_=0 两种情况下都能编译
    • @alnet:那么您应该无条件地放入state 成员,或者只在#ifdef _DEBUG_ 块内使用ASSERT。请注意,顺便说一句,您不应该定义以_ 和大写字母开头的宏;此类名称保留供 C 实现内部使用。
    猜你喜欢
    • 1970-01-01
    • 2014-03-03
    • 1970-01-01
    • 1970-01-01
    • 2012-08-31
    • 1970-01-01
    • 1970-01-01
    • 2017-02-16
    • 1970-01-01
    相关资源
    最近更新 更多