2012-07-19 1 views
3

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

ТАК, вы можете включить блоки «# ifndef/# endif» из файла makefile?

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

ответ

8

Вы можете добавить -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.

+0

Благодарим вас за прекрасное понимание! –

3

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

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

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

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

+0

Спасибо, что рассказали мне о флагом -U –

Смежные вопросы