LINUX.ORG.RU

[C++][Qt] Отладочная и финальная сборка

 ,


0

1

Допустим имеется некоторый файл

//file.cpp
#define DEBUG 1
//code
if (DEBUG)
 { 
  DebugPrint("some str");// зависит от платформы (?), на Qt например можно qDebug<<"string";
 }    //*/
Вопрос: как сделать, чтоб при компиляции код if (DEBUG) DoSome() не включался в собранный файл, если DEBUG установить в 0?
Или компилятор «увидит», что часть кода не будет использована и просто пропустит этот кусок кода? (если собирать например с флагами -O1, -O2 )
Если файлов много, как сделать чтоб значение DEBUG изменялось во всех файлах (желательно без конструкций вида #include isdebug.h, в котором одна строчка #define DEBUG 1 )

Понятно, что если версия финальная и правится больше не будет, можно просто поудалять/закоментировать эти куски (я их помечаю специальным комментарием чтоб легче было искать), но если потом придется править код, немного неудобно перед сборкой удалять/коментировать строки

★★★★

Последнее исправление: ymuv (всего исправлений: 1)

хе, ябы сделал пдругому.

закоментил бы #define DEBUG 1

а где-то в районе qmake project.pro дописал бы условия с глобальными дефайнами

visual ★★★
()

Вопрос: как сделать, чтоб при компиляции код if (DEBUG) DoSome() не включался в собранный файл, если DEBUG установить в 0?

#define DEBUG

/* код */

#ifdef DEBUG

/* отладочный код */

#endif

drBatty ★★
()
Ответ на: комментарий от unfo

Да, смотри пост выше. Только как сделать чтоб во всех файлах это работало, чтоб в каждом не писать #define DEBUG?

ymuv ★★★★
() автор топика
Ответ на: комментарий от ymuv

Вроде понял, нужно в Makefile написать #define DEBUG ?

ymuv ★★★★
() автор топика
Ответ на: комментарий от ymuv

В cmake так, например, устанавливается переменная системы сборки, которую можно записать в *.h файл, который уже везде, где используется, инклюдить.

Например: если добавить к строке сборки -DDebug=1, то оно соберется в Debug режиме (выглядит примерно так:

cmake .. -DDebug=1

Если этого не делать, то оно будет собираться в релизном режиме.

Это все в cmake.

В qmake вот http://www.qtcentre.org/threads/46369-How-to-find-debug-or-release-mode-using...

unfo ★★★★★
()

В .pro файле добавь DEFINES += DEBUG и все.

MuZHiK-2 ★★★★
()
Ответ на: комментарий от panter_dsd

#ifndef -NDEBUG

NDEBUG - это же принято юзать только для assert'ов, не?

DELIRIUM ☆☆☆☆☆
()

типичный прграммист на qt не знает даже про препроцессор и man gcc
кажется, php уже не в моде

anonymous
()

В .pro файл добавь

Debug: DEFINES += DEBUG

После этого в коде можно делать так:

#ifdef DEBUG
    DebugPrint("some str"); // зависит от платформы (?), на Qt например можно qDebug<<"string";
#endif
Хотя обычно применяется обратное условие и символ NDEBUG

m0rph ★★★★★
()
Ответ на: комментарий от anonymous

типичный прграммист на qt не знает даже про препроцессор и man gcc

Я еще студент, только учусь.

ymuv ★★★★
() автор топика

никто не вспомнил про qt-шное config += debug в .pro?

world
()
Ответ на: комментарий от m0rph

Для читабельности кода лучше так:

void DebugPrint(...)
{
#ifdef DEBUG // #ifndef NDEBUG
   printf(...);
#endif
}
А потом просто:
DebugPrint("some str");

gag ★★★★★
()
Ответ на: комментарий от gag

В случае с задачей автора, согласен. Компилятор все равно вырежет вызов пустой функции в релизной сборке.

m0rph ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.