Кодовый блок отладки препроцессора

Я пишу программу на C ++ с Codeblocks, и для целей отладки мне нужно знать, установлено ли для Building-Target Codeblocks значение «DEBUG» или «RELEASE».

Я уже попробовал это:

#ifdef DEBUG
    printf("Debug-Message");
#endif

и это

#ifdef _DEBUG
    printf("Debug-Message");
#endif

Но ни одно из этих слов не определено. Нужно ли мне определять DEBUG самостоятельно и менять его каждый раз, когда я меняю Building-Target, или есть слово, которое я не знаю?

 Basile Starynkevitch20 окт. 2012 г., 13:29
Не забудьте завершить строки формата отладки\n

Ответы на вопрос(2)

утверждают, (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 << для моих типов.

Решение Вопроса

когда я меняю Building-Target, или есть слово, которое я не знаю?

Я не знаю, что, если что-нибудь установлено по умолчанию Code :: Blocks. Но, если вы определите свой собственный #defines

Project->Build options...->[Debug|Release]->#defines 

вам не нужно менять их при переключении между целями сборки (DEBUG или RELEASE). Он позволяет вам определять значения, специфичные для сборки Debug, а также значения, специфичные для сборки Release.

Чтобы избежать необходимости вводить его вручную каждый раз для каждого нового проекта, вы можете создать небольшой проект, используя только ваши Debug / Release #defines, и сохранить его какшаблон проекта а затем создать новые проекты из этого шаблона проекта.

 jww17 янв. 2014 г., 11:49
CodeBlocks действительно должны определять их, так как он знает о Debug / Release. И это должно изменитьсяassertповедение отabort кtrap когда в конфигурации отладки. Это абсолютно бессмысленноabort программа в то время как под отладчиком. Я поражен тем, сколько людей не используютassertиз-за глупых решений комитета.

Ваш ответ на вопрос