Как включить собственный макрос TRACE только для определенных файлов? - PullRequest
2 голосов
/ 29 марта 2011

Я написал следующий макрос трассировки в файл с именем «debug.h».

#define TRACE(x)     \
    printf(          \
        "%s(%d): ",  \
        __FILE__,    \
        __LINE__     \
        );           \
                     \
  printf(x);

В отладке я хотел бы включить макрос только для определенных файлов, поскольку ресурсы на платформе ограниченыЯ использую.Я не хочу полностью удалять вызовы TRACE из файлов.Просто отключите их.

Есть ли чистый способ сделать это в C с помощью препроцессора?

Ответы [ 4 ]

2 голосов
/ 31 марта 2011

In debug.h:

#if TRACE_ENABLE
#define TRACE(x)     \
    printf(          \
        "%s(%d): ",  \
        __FILE__,    \
        __LINE__     \
        );           \
                     \
  printf(x);
#else
#define TRACE(x)
#endif

Затем в исходных файлах, где вы не хотите трассировать:

#define TRACE_ENABLE 0
#include "debug.h"

или просто:

#include "debug.h"

В исходных файлах для включения трассировки:

#define TRACE_ENABLE 1
#include "debug.h"
1 голос
/ 29 марта 2011

Иногда я использовал хитрость - использование битовой маски для включения подмножества файлов, в которых используется TRACE: File1.c:

#if TRACE_MASK & 0x01
#define TRACE(x) ...
#endif

File2.c:

#if TRACE_MASK & 0x02
#define TRACE(x) ...
#endif

... Затем вы можете определить свой макрос TRACE_MASK в параметрах предварительной обработки: / DTRACE_MASK = 0x03, чтобы включить трассировку как для File1.c, так и для File2.c Единственная проблема заключается в том, что число битов ограничено... (но вы можете использовать более одного макроса: TRACE_MASK1, TRACE_MASK2 ...) Пока

РЕДАКТИРОВАТЬ: конечно, вы можете написать tdefinition один раз в файле "trace.h" и просто переопределить маскув каждом источнике:

Файл trace.h:

#if TRACE_MASK & TRACE_CURRENT
#define TRACE(x) ...
#else
#define TRACE(x) do {} while(0)
#endif

File1.c:

#define TRACE_CURRENT 0x01
#include "trace.h"

File2.c:

#define TRACE_CURRENT 0x02
#include "trace.h"
1 голос
/ 29 марта 2011

Хотя оба ответа мне кажутся хорошими, я думаю, что ответ Джузеппе в большинстве случаев более полезен, поскольку, если вы используете этот макрос много раз в файле и хотите включить / выключить отладку для полных файлов, метод pmg состоит в следующем: утомительно. Важно не забыть добавить оператор else: #else TRACE(X);, если вы хотите редактировать его в определенном файле, а не в заголовке, используйте:

#ifdef TRACE
#undef TRACE
#endif
#define TRACE(X)
0 голосов
/ 29 марта 2011

А как же

#define TRACE(x, y) do if (y) {/*your prints*/} while (0)

, а также

#define TRACE_ENABLE 1

или

#define TRACE_ENABLE 0

вверху ваших источников.

Затем замените вызовы TRACE на

TRACE(foo, TRACE_ENABLE);
...