Как включить блоки "#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
или добавьте его непосредственно к вызову компилятора в цели компиляции.
Если флаг определяется где-то в исходном дереве, это не поможет.