我在名为“debug.h”的文件中编写了以下跟踪宏。
#define TRACE(x) \
printf( \
"%s(%d): ", \
__FILE__, \
__LINE__ \
); \
\
printf(x);
在调试中,我想仅为某些文件启用宏,因为资源在我正在使用的平台上受到限制。我不想从文件中完全删除TRACE调用。只需禁用它们。
使用预处理器在C中有一种干净的方法吗?
答案 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);