Подтвердить что ты не робот

"#ifdef" внутри макроса

Возможный дубликат:
#ifdef внутри #define

Как использовать символ "#" успешно внутри макроса? Он кричит, когда я делаю что-то вроде этого:

#define DO(WHAT)        \
#ifdef DEBUG        \                           
  MyObj->WHAT()         \       
#endif              \
4b9b3361

Ответ 1

Вы не можете этого сделать. Вы должны сделать что-то вроде этого:

#ifdef DEBUG
#define DO(WHAT) MyObj->WHAT()
#else
#define DO(WHAT) do { } while(0)
#endif

do { } while(0) избегает пустых операторов. См. этот вопрос, например.

Ответ 2

Он кричит, потому что вы не можете этого сделать.

В качестве альтернативы я предлагаю следующее:

#ifdef DEBUG
#define DO(WHAT) MyObj->WHAT()
#else
#define DO(WHAT)
#endif

Ответ 3

Кажется, что то, что вы хотите сделать, может быть достигнуто так, без каких-либо проблем:

#ifdef DEBUG
#    define DO(WHAT) MyObj->WHAT()
#else
#    define DO(WHAT) while(false)
#endif

Btw, лучше использовать макрос NDEBUG, если у вас нет более конкретной причины. NDEBUG более широко используется в качестве макроса, что означает отсутствие отладки. Например, стандартный assert макрос можно отключить, указав NDEBUG. Ваш код будет выглядеть следующим образом:

#ifndef NDEBUG
#    define DO(WHAT) MyObj->WHAT()
#else
#    define DO(WHAT) while(false)
#endif

Ответ 4

Вы можете сделать то же самое:

#ifdef DEBUG
#define DO(WHAT) MyObj->WHAT()
#else
#define DO(WHAT)
#endif

Ответ 5

Как насчет:

#ifdef DEBUG
#define DO(WHAT) MyObj->WHAT()
#else
#define DO(WHAT)
#endif