2015-10-15 2 views
0

Мне нужно настроить способ отладки моей программы из файла make. В частности, когда я печатаю make -B FLAG=-DNDEBUG Мне нужна программа для нормальной работы. Но когда этого флага нет, мне нужно несколько команд assert() для запуска кода.Отладка с использованием флагов makefile в C

Чтобы уточнить, мне нужно знать, как проверить, нет ли этого флага из моего кода на C, я бы предположил, что он имеет какое-то отношение к #ifndef, я просто не знаю, куда идти оттуда.

Простите мое невежество, любой ответ будет очень благодарен!

ответ

0

Предполагая, что вы говорите о макросе assert из стандартной библиотеки (#define d в <assert.h>), тогда вам не нужно ничего делать. В библиотеке уже установлен флаг NDEBUG.

Если вы хотите, чтобы ваш собственный код делал что-то, только если макрос не является #define d, используйте #ifdef, как вы уже подозреваете в своем вопросе.

Например, у нас может быть слишком сложное условие, чтобы вставить одно выражение assert, поэтому мы хотим, чтобы для него была переменная. Но если assert не раскрывается ни к чему, то мы не хотим, чтобы это значение вычислялось. Поэтому мы можем использовать что-то вроде этого.

int 
questionable(const int * numbers, size_t length) 
{ 
#ifndef NDEBUG 
    /* Assert that the numbers are not all the same. */ 
    int min = INT_MAX; 
    int max = INT_MIN; 
    size_t i; 
    for (i = 0; i < length; ++i) 
    { 
     if (numbers[i] < min) 
     min = numbers[i]; 
     if (numbers[i] > max) 
     max = numbers[i]; 
    } 
    assert(length >= 2); 
    assert(max > min); 
#endif 
    /* Now do what you're supposed to do with the numbers... */ 
    return 0; 
} 

Имейте в виду, что этот стиль кодирования делает жесткий для чтения кода и просят для Heisenbugs, что чрезвычайно трудно отлаживать. Гораздо лучший способ выразить это - использовать функции.

/* 1st helper function */ 
static int 
minimum(const int * numbers, size_t length) 
{ 
    int min = INT_MAX; 
    size_t i; 
    for (i = 0; i < length; ++i) 
    { 
     if (numbers[i] < min) 
     min = numbers[i]; 
    } 
    return min; 
} 

/* 2nd helper function */ 
static int 
maximum(const int * numbers, size_t length) 
{ 
    int max = INT_MIN; 
    size_t i; 
    for (i = 0; i < length; ++i) 
    { 
     if (numbers[i] > max) 
     max = numbers[i]; 
    } 
    return max; 
} 

/* your actual function */ 
int 
better(const int * numbers, int length) 
{ 
    /* no nasty `#ifdef`s */ 
    assert(length >= 2); 
    assert(minimum(numbers, length) < maximum(numbers, length)); 
    /* Now do what you're supposed to do with the numbers... */ 
    return 0; 
} 
0

При вызове сделать с или без "FLAG = -DNDEBUG" вы нужны правила, как это в вашем Makefile:

%.o: %.c gcc -c $(FLAG) $<

В коде C вам нужно что-то вроде этого:

#ifndef NDEBUG 
    fprintf(stderr, "My trace message\n"); 
#endif 
Смежные вопросы