не имеет ошибки компиляции члена - PullRequest
1 голос
/ 10 июля 2011

У меня есть следующий код, и когда я пытаюсь скомпилировать его, я получаю сообщение об ошибке:

error: в 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);
}

Ответы [ 3 ]

3 голосов
/ 10 июля 2011

Просто #define ASSERT как

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

Обратите внимание, что это может изменить поведение других участков кода, потому что ASSERT больше не оценивает его аргумент, но именно так люди и ожидают, что он будет вести себя так или иначе.

Или выполните сборку _DEBUG_, но это не решает проблему, а просто позволяет ее избежать.

2 голосов
/ 10 июля 2011

Это связано с

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

, который оценивает p_list_item.state == 0 и, следовательно, нуждается в state, даже если _DEBUG_ не #define 'd.

2 голосов
/ 10 июля 2011

Ваш класс имеет упомянутого члена в том и только в том случае, если определено _DEBUG_, и, очевидно, это не так.

#define _DEBUG_

в начале вашего TU или измените настройки проекта, чтобы определить его каким-либо другим способом

...