Сел почитать 4-е издание Страуструпа и наткнулся на функцию, которую удобно использовать для отладочного вывода, если надоело постоянное << ' ' <<
между переменными в выражениях вроде cerr << variable1 << ' ' << variable2 << ' ' << variable3 << endl;
и хочется немного лучшей читабельности.
Функция принимает любое количество аргументов любого типа, который можно вывести стандартным cerr'ом, выводит их подряд через пробел и затем переходит на новую строку.
void dout() { cerr << endl; }
template <typename Head, typename... Tail>
void dout(Head H, Tail... T) {
cerr << H << ' ';
dout(T...);
}
Пример использования (str == "ololo"):
dout(123,str,4.0);
dout();
dout(1,2);
/* Prints:
123 ololo 4
1 2
*/
То же самое обычным способом:
cerr << 123 << ' ' << str << ' ' << 4.0 << endl;
cerr << endl;
cerr << 1 << ' ' << 2 << endl;
Прям Prolog какой-то, здорово, спасибо)
Для предпочитающих C-style ввод-вывод вместо потоков есть не менее приятный макрос, также утянутый мною откуда-то из документации по gcc:
Также удобно его сразу дефайнить, чтобы он компилировался на сервере ни во что:
(да, если кто не знает, оператор
42;
— корректный оператор, который ничего не делает)Если что, то
;;
тоже вполне корректно и можно дефайнить в пустоту.Твой вариант хуже работает с записями вида:
А я большой любитель пописать выражения через запятые. Моё раскроется в синтаксически корректное:
А твоё в синтаксически некорректное:
Эм, я имел ввиду все-таки в пустоту, но да, согласен, получится все равно не корректно
Лучше тогда уж
((void)42)
, чтобы это 42 нигде не использовать случайно.Ура! я нашел еще одного человека который
не любит писать лишние скобочкипишет через запятую!Вместо такого обычно пишут
Этот вариант ещё поймает и попытку использовать результат вызова
eprintf()
.EDIT: Ой, PavelKunyavskiy это уже написал.
Ещё, пожалуй, тут стоит упомянуть один удобный макрос:
Он выводит то, что ему передаётся, в текстовом виде и само значение.
Например:
В таком логе гораздо удобнее ориентироваться, чем просто в наборе значений. И между тем экономится немало времени, по сравнению если б мы писали комментарии к логу вручную:
cerr << "x=" << x << endl;
Изрядно поизвращавшись, можно заставить этот макрос работать с переменным (но ограниченным) числом параметров. То-есть мы вызовем
DBN(x, y, x*y+2);
и получимx=5 y=10 x*y+2=52
Решение, работающие и для VS, и для GNU, может выглядеть следующим образом: http://ideone.com/y39aaF
Если же вы используете только ГНУшный компилятор, то можно сделать чуть проще: http://ideone.com/8PwAyg
Использовал комменты с этой странички
Для любителей вывода с помощью оператора << можно сделать так:
Использование:
dout() << "abc" << 123;
Не хватает тут разве что специализаций для возможности вывода контейнеров.