如何仅为特定文件启用自定义TRACE宏?

时间:2011-03-28 20:48:44

标签: c embedded

我在名为“debug.h”的文件中编写了以下跟踪宏。

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

在调试中,我想仅为某些文件启用宏,因为资源在我正在使用的平台上受到限制。我不想从文件中完全删除TRACE调用。只需禁用它们。

使用预处理器在C中有一种干净的方法吗?

4 个答案:

答案 0 :(得分:2)

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 :(得分:1)

我曾经使用过的一个技巧是使用位掩码来启用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 ......) 再见

编辑:当然你可以在文件“trace.h”中写一次tdefinition,然后重新定义每个源中的掩码:

文件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"

答案 2 :(得分:1)

虽然这两个答案对我来说似乎都很好,但我认为Giuseppe的答案在大多数情况下更有用,因为如果你在文件中多次使用这个宏,并且想要为完整文件打开/关闭调试,那么pmg的方法是疲惫不堪。 重要的是不要忘记添加else语句:#else TRACE(X);如果要在特定文件中而不是在标题中编辑它,请使用:

#ifdef TRACE
#undef TRACE
#endif
#define TRACE(X)

答案 3 :(得分:0)

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

以及

#define TRACE_ENABLE 1

#define TRACE_ENABLE 0

位于您的来源顶部。

然后用

替换TRACE调用
TRACE(foo, TRACE_ENABLE);