Должен ли я самостоятельно определять DEBUG и изменять его каждый раз, когда я изменяю объект Building-Target, или есть слово, которое я не знаю?
blockquote>I не знаю, что, если по умолчанию установлено значение Code :: Blocks. Но, если вы определяете свои собственные #defines
Project->Build options...->[Debug|Release]->#defines
, вам не нужно их менять при переключении между целями сборки (DEBUG или RELEASE). Он позволяет вам определять значения, специфичные для сборки Debug, а также значения, характерные для сборки Release.
Чтобы избежать необходимости вручную вводить его каждый раз для каждого нового проекта, вы можете сделать небольшой проект только с вашими параметрами Debug / Release #defines и сохраните их как шаблон проекта, а затем создайте новые проекты из этого шаблона проекта.
Обычный способ, предложенный assert (3) справочной страницей и привычками (с <assert.h>
в C или <cassert>
в C ++), заключается в определении NDEBUG
в командной строке (например, для компиляции с gcc -Wall -DNDEBUG
) для компиляции без отладки. В Makefile
вы можете CPPFLAGS += -DNDEBUG
в режиме деблокирования (и скомпилировать с g++ -Wall -g
в режиме отладки).
Моя собственная привычка может иметь что-то вроде
#ifndef NDEBUG
#define dbgprintf(Fmt,...) do{fprintf(stderr,"%s:%d:" Fmt "\n", \
__FILE__, __LINE__, \
##__VA_ARGS__);}while(0)
#else
#define dbgprintf(Fmt,...) do{}while(0)
#endif
в общем файле заголовка и использовать dbgprintf("i=%d", i)
в другом месте кода. Обратите внимание, что я использую константную привязку строки в аргументе макроса Fmt
, добавляя к ней постоянную новую строку, и что мой вывод отладки содержит имя исходного файла и номер строки (вы также можете использовать __func__
, если хотите). В чистом C ++-коде я мог бы использовать
#ifndef NDEBUG
#define DBGOUT(Out) do{std::out << __FILE__ << ":" << __LINE__ \
<< " " << Out << std::endl;}while(0)
#else
#define DBGOUT(Out) do{}while(0)
#endif
и использовать DBGOUT("i=" << i)
с преимуществом использования определенных определений operator <<
для моих типов.
assert
сabort
наtrap
, когда находится в конфигурации Debug. Нет никакого смысла дляabort
программы в то время как под отладчиком. Я поражен тем, сколько людей не используютassert
из-за немых решений комитета. – jww 17 January 2014 в 12:49