Я пишу программу на C ++ с Codeblocks, и для целей отладки мне нужно знать, установлено ли для Building-Target Codeblocks значение «DEBUG» или «RELEASE».
Я уже попробовал это:
#ifdef DEBUG
printf("Debug-Message");
#endif
и это
#ifdef _DEBUG
printf("Debug-Message");
#endif
Но ни одно из этих слов не определено.
Нужно ли мне определять DEBUG самостоятельно и менять его каждый раз, когда я меняю цель здания, или есть слово, которое я не знаю?
Должен ли я определять DEBUG самостоятельно и менять его каждый раз, когда меняю
Building-Target, или есть слово, которое я не знаю?
Я не знаю, что, если что-нибудь установлено по умолчанию Code :: Blocks. Но, если вы определите свои собственные #defines
Project->Build options...->[Debug|Release]->#defines
вам не нужно менять их при переключении между целями сборки (DEBUG или RELEASE). Он позволяет вам определять значения, специфичные для сборки Debug, а также значения, специфичные для сборки Release.
Чтобы избежать необходимости вводить его вручную каждый раз для каждого нового проекта, вы можете создать небольшой проект, используя только #defines Debug / Release, и сохранить его как шаблон проекта а затем создать новые проекты из этого шаблона проекта.
Обычный способ, как предложено утверждают, (3) справочная страница и привычки (с <assert.h>
в С или <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 <<
для моих типов.