Чтобы распечатать отладочные сообщения в моей программе, у меня есть это, которое можно использовать следующим образом:
DBG(5) << "Foobar" << std::endl;
5 означает уровень сообщения, если уровень отладки меньше 5, сообщение не будет напечатано. В настоящее время это реализовано так:
#define DBG(level) !::Logger::IsToDebug((level)) ? : ::Logger::Debug
В основном IsToDebug
проверяет, должно ли сообщение быть напечатано, и возвращает true, когда это необходимо. Logger::Debug
— это std::ostream. Это также работает с gcc и clang, однако clang генерирует неиспользуемые предупреждения результата выражения. Согласно этому письму это не нравится либо изменить.
Добавление к нему префикса (void)
не работает, он будет приводить только перед ?
, что приводит к ошибке компиляции (очевидно, что void не может быть преобразован в bool). Другая проблема с этим синтаксисом заключается в том, что он использует расширение gcc.
Выполнение таких действий, как #define DBG(x) if (::Logger::IsToDebug((x))) ::Logger::Debug
, решает проблему, но это верный способ сломать вашу программу (if (foo) DBG(1) << "foo"; else ...
) (и я не могу поместить все это в do { ... } while(0)
из-за того, как вызывается макрос).
Единственное более или менее жизнеспособное решение, которое я придумал, это (при условии, что IsToDebug
возвращает либо 0, либо 1):
#define DBG(level) for(int dbgtmpvar = ::Logger::IsToDebug((level)); \
dbgtmpvar > 0; --dbgtmpvar) ::Logger::Debug
Что кажется излишним (не считая накладных расходов во время выполнения)
DBG5(e)
условно, чтобы он не расширялся до нуля для уровней отладки ниже 5. Для выражения просто определите в обычном C++ класс создателя строкиS
, затем используйте выражение, подобноеDBG5( S() << "blah " << x );
. . Ура и чт., - person Cheers and hth. - Alf   schedule 16.02.2012<<
имеет более высокий приоритет, чем?:
, он будет интерпретировать его как(IsToDebug(x)) ? : (Debug << "Foobar" << std::endl);
и не будет пытаться применить<<
к логическому значению. - person DirtY iCE   schedule 16.02.2012