Как отключить функцию макроса? - PullRequest
0 голосов
/ 16 ноября 2011

Можно ли устанавливать макросы отладки на пустую строку, когда я хочу отключить проверки отладки? assert и BOOST_ASSERT установлены на ((void)0), когда определено NDEBUG.

Почему бы не сделать что-то подобное?

#ifdef NDEBUG

#define MY_DEBUG_MACRO_FUNCTION(x,y,z) ""

#elif
  // define macros
#endif

Ответы [ 3 ]

4 голосов
/ 16 ноября 2011

Идея состоит в том, чтобы макрос ничего не делал в сборках релиза.Вы можете определить его как пустой строковый литерал, поскольку ""; является допустимым выражением.Я полагаю, что причина определения ((void)0) заключается в том, что реализация не генерирует предупреждения для выражения.У меня нет оснований говорить это, но некоторые минимальные тесты показывают, что ""; выдает предупреждение, а ((void)0) - нет.Конечно, предупреждения не стандартизированы, поэтому может существовать конкретная реализация, которая также выдает предупреждение для ((void)0), но она должна была бы определить assert для чего-то другого, что не в NDEBUG сборках, иначебыть довольно раздражающим для пользователя.

2 голосов
/ 16 ноября 2011

Не все не в порядке. Но вы можете сделать «тело» макроса пустым:

#define MY_DEBUG_MACRO_FUNCTION(x,y,z)

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

0 голосов
/ 16 ноября 2011

По вашей теме используйте #undef. Это полезно, когда есть макро-версия и C-версия функции. Таким образом, вы можете использовать скомпилированный код поверх встроенного макроса.

...