Как включить блоки "#ifndef/#endif" в сборках makefile?

Я пытаюсь включить параметры отладки в MuPDF. По какой-то причине они использовали #ifndef NDEBUG а также #endif выпадает код, который я хочу использовать. Я искал всю библиотеку, но нигде не смог найти никаких следов NDEBUG. Мне удалось обойти это, добавив #undef NDEBUG в заголовке, но я хотел бы знать, есть ли более ненавязчивый метод для этого.

Итак, вы можете включить блоки "#ifndef/#endif" из make-файла?

Кроме того, почему вы используете #ifndef выделять код серым цветом? Разве это не должно быть #ifdef NDEBUG?

2 ответа

Решение

Вы можете добавить -DNDEBUG к следующим 3 переменным - CFLAGS, CPPFLAGS и CXXFLAGS в вашем Makefile, чтобы определить NDEBUG. Что эквивалентно добавлению #define NDEBUG

Есть и другие варианты:

-DNBDEBUG=1

эквивалентно

#define NDEBUG 1

И ответить на вопрос о том, почему кто-то использует #ifndef вместо #ifdef, это потому, что он очень четко выделяет ваши модификации исходного кода.

Например, рассмотрите следующий код как оригинальную версию:

int a = 123;
int b = 346;
int c = a + b;

И вам нужно добавить макрос DO_MULT, который будет умножаться вместо этого - есть 2 способа сделать это.

Первая вариация:

int a = 123;
int b = 346;
#ifdef DO_MULT
int c = a *b;
#else
int c = a + b;
#endif

Второй вариант:

int a = 123;
int b = 346;
#ifndef DO_MULT
int c = a + b;
#else
int c = a *b;
#endif

Если вы используете difftools, чтобы увидеть изменения - второй вариант покажет разницу более четко по сравнению с первым.

Еще одна причина, по которой вы бы использовали #ifndef, - это делать что-то в сценариях CATCH-ALL-EXCEPT.

#ifndef не опускает код, если флаг определен, следовательно, он используется. Вам удалось включить код, используя #undef,

И то и другое #ifdef а также #ifndef полезны, в качестве оправдания рассмотрим этот надуманный пример: у вас есть куча отладки printf код, который вы только хотите скомпилировать в сборку Debug, используя #ifdef DEBUG условия. В том же исполняемом файле у вас также есть код, который вы хотите исключить из сборки Debug. В этом случае с помощью #ifndef DEBUG твой единственный выбор.

Вы можете определить такие флаги в make-файле, а также попытаться удалить предыдущие определения, используя -U, Искать CFLAGS переменная в make-файле и добавить -UNDEBUG или добавьте его непосредственно к вызову компилятора в цели компиляции.

Если флаг определяется где-то в исходном дереве, это не поможет.

Другие вопросы по тегам