2011-03-28 30 views
2

我在一個名爲「debug.h」的文件中寫了下面的跟蹤宏。如何爲特定文件啓用自定義TRACE宏?

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

在調試我想,只啓用宏某些文件,因爲資源是我使用的平臺上的限制。我不想從文件中完全刪除TRACE呼叫。只需禁用它們。

在C中使用預處理器有乾淨的方法嗎?

回答

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" 
0

什麼

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

#define TRACE_ENABLE 1 

#define TRACE_ENABLE 0 

在你的源代碼頂部。

然後用

TRACE(foo, TRACE_ENABLE); 
1

我somtimes使用的伎倆更換TRACE調用是使用位掩碼,使文件的子集whete使用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裏:

​​

FILE1.C:

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

file2.c中:

#define TRACE_CURRENT 0x02 
#include "trace.h" 
1

雖然這兩個答案似乎對我好,我覺得朱的回答是大部分時間更加有用,因爲如果你使用這個宏多次在文件中,並且希望打開/關閉完整文件的調試開關,pmg的方法令人筋疲力盡。 重要的是不要忘記添加else語句:#else TRACE(X);,如果你想在特定的文件,而不是在標題編輯它,使用:

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