ilyaraz's blog

By ilyaraz, 12 years ago, In Russian

Все олимпиадники делятся на два лагеря: те, кто отлаживает в отладчике, и те, кто отлаживает отладочным выводом. Можно бесконечно спорить о том, какой метод удобнее, но факт остается фактом -- и таких, и таких людей полным-полно. Я отношусь ко второму лагерю: во многих ситуациях применение отладчика невозможно, поэтому хочется быть от него независимым. Более того, лично для меня отладочный вывод удобнее (я использую отладчик только для того, чтобы понять, где именно программа упала).

Так о чем же этот пост? Большинство минусов отладочного вывода на C++ происходит из того, что, к примеру, чтобы вывести вектор, нужно написать довольно много байтов кода. Это не слишком удобно. Чтобы бороться с подобными проблемами, я написал маленькую библиотеку, которая лежит здесь. Если вы напишете такой код: http://pastebin.com/9t87jmdp, то в результате в stderr выведется следующее:

file "test.cpp" line 14: a = {(0, {1, 2}), (1, {})}
file "test.cpp" line 18: aa = {'a', 'b'}
file "test.cpp" line 19: 2 * 2 = 4

Если же вы хотите убрать отладочный вывод, то нужно закомментировать строку #define DEBUG_OUTPUT в test.cpp. В первой версии выводятся следующие переменные:
  • которые можно вывести с помощью оператора <<;
  • у которых есть .begin() и .end() (коллекции, например);
  • std::pair.
Код в debug_output.h использует забавный хак C++, который называется SFINAE.

P.S. Код использует C++11 (поддержка которого есть, к примеру, в g++ 4.6 и Visual Studio 2010). Но, отключив отладочный вывод, можно компилировать код и более старыми компиляторами.

UPD В новой версии C++11 больше не нужен, также поправлен баг, который заметил Петросян.
  • Vote: I like it
  • +73
  • Vote: I do not like it