Ответ 1
Вы не можете этого сделать. Вы должны сделать что-то вроде этого:
#ifdef DEBUG
#define DO(WHAT) MyObj->WHAT()
#else
#define DO(WHAT) do { } while(0)
#endif
do { } while(0)
избегает пустых операторов. См. этот вопрос, например.
Возможный дубликат:
#ifdef внутри #define
Как использовать символ "#" успешно внутри макроса? Он кричит, когда я делаю что-то вроде этого:
#define DO(WHAT) \
#ifdef DEBUG \
MyObj->WHAT() \
#endif \
Вы не можете этого сделать. Вы должны сделать что-то вроде этого:
#ifdef DEBUG
#define DO(WHAT) MyObj->WHAT()
#else
#define DO(WHAT) do { } while(0)
#endif
do { } while(0)
избегает пустых операторов. См. этот вопрос, например.
Он кричит, потому что вы не можете этого сделать.
В качестве альтернативы я предлагаю следующее:
#ifdef DEBUG
#define DO(WHAT) MyObj->WHAT()
#else
#define DO(WHAT)
#endif
Кажется, что то, что вы хотите сделать, может быть достигнуто так, без каких-либо проблем:
#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
Вы можете сделать то же самое:
#ifdef DEBUG
#define DO(WHAT) MyObj->WHAT()
#else
#define DO(WHAT)
#endif
Как насчет:
#ifdef DEBUG
#define DO(WHAT) MyObj->WHAT()
#else
#define DO(WHAT)
#endif