Чтобы напечатать отладочные сообщения в моей программе, у меня есть, которые могут быть использована, как это:Clang: выражение результат не используются с тройным оператором
DBG(5) << "Foobar" << std::endl;
5 означает уровень сообщения, если уровень отладки меньше чем 5, оно не будет печатать сообщение. В настоящее время она реализуется как:
#define DBG(level) !::Logger::IsToDebug((level)) ? : ::Logger::Debug
В основном IsToDebug
проверки, если сообщение должно быть напечатано, и возвращает истину, когда он должен. Logger::Debug
- это std :: ostream. Это также работает с gcc и clang, однако clang генерирует результат выражения без использования предупреждений. Согласно this email, это тоже не нравится.
Префикс с (void)
не работает, он будет отличать вещь до ?
, что приведет к ошибке компиляции (void не может быть преобразован в bool, очевидно). Другая проблема с этим синтаксисом заключается в том, что он использует gcc extension.
делать вещи, как #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
что выглядит как массовое убийство (не считая, что это во время выполнения накладных)
Верно ли ваше использование тернарного оператора? Где второе выражение? – Nawaz
Представляется, что это непреднамеренное использование тройного расширения gcc. DirtY iCE, вероятно, думал, что ничего там не поместит, но на самом деле он ставит там bool. – Joe
Как я уже упоминал, это расширение gcc (это также означает, что clang также поддерживается), см. Http://gcc.gnu.org/onlinedocs/gcc/Conditionals.html#Conditionals –