Как запустить функцию только в режиме отладки в C с Code Block [duplicate]

4
задан Brian Tompsett - 汤莱恩 20 April 2016 в 14:18
поделиться

2 ответа

Должен ли я самостоятельно определять DEBUG и изменять его каждый раз, когда я изменяю объект Building-Target, или есть слово, которое я не знаю?

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

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

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

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

3
ответ дан Scooter 20 August 2018 в 16:06
поделиться
  • 1
    CodeBlocks действительно должны определять их, так как его Debug / Release известно. И он должен изменить поведение assert с abort на trap, когда находится в конфигурации Debug. Нет никакого смысла для abort программы в то время как под отладчиком. Я поражен тем, сколько людей не используют assert из-за немых решений комитета. – jww 17 January 2014 в 12:49

Обычный способ, предложенный 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 << для моих типов.

3
ответ дан Basile Starynkevitch 20 August 2018 в 16:06
поделиться
Другие вопросы по тегам:

Похожие вопросы: