2010-11-04 32 views
18

我在tracing.hh中有一組調試宏。它是否生成代碼和輸出由真實源代碼中的宏標誌控制:空宏定義的測試

// File: foo.cc 
#define TRACING 0 
#include "tracing.hh" 
// Away we go . . . 
TRACEF("debug message"); 

標誌TRACING應該有一個值;我通常切換0和1之間

在tracing.h,

  • #ifdef TRACING會告訴我,跟蹤定義。
  • #if TRACING控制功能的宏定義一樣TRACEF()

但如果追蹤有沒有價值呢?然後#if TRACING產生一個錯誤:

In file included from foo.c:3: 
tracing.hh:73:12: error: #if with no expression 

如何測試,如果跟蹤被定義,但有沒有價值?

回答

0

#if defined(TRACING) && !TRACING 

做的伎倆?

+0

差不多,我想。看下一個答案: – pdbj 2010-11-08 18:47:30

+4

這不幸的是不會工作。您將遇到同樣的問題,因爲TRACING將被刪除。你最終會得到類似的結果:「#if defined(TRACING)&&!」。因此,「錯誤:操作員」!沒有合適的操作數「將在建造時提高。 – ForceMagic 2012-06-19 00:02:43

22

隨着Matti的建議和一些更多的戳,我認爲問題是這樣的:如果TRACING沒有價值,我們需要一個有效的預處理器表達式在測試#if ...Gnu cpp manual 表示它必須評估爲一個整數表達式,所以我們需要一個即使其中一個參數丟失也是有效的表達式。我終於打是:

#if (TRACING + 0) 
# . . . 
  • 如果TRACING有一個數值(如#define TRACING 2 \n),CPP具有有效的表達,我們沒有改變的價值
  • 如果TRACING沒有價值。 (如在#define TRACING \n),預處理器的計算結果#if (+0)false

的唯一情況下,這不處理是

  • 如果TRACING具有令牌值(,即ON)。 cpp手冊中說「不是宏的標識符......都被認爲是數字零,」,其值爲false。然而,在這種情況下,考慮這個值是更有意義的。唯一能做正確事情的標記是布爾文字truefalse
+0

您仍然可以通過使用'#'運算符使宏成爲字符串來進行運行時測試。 C++ 11可能會把它變成編譯時測試(我認爲使用'constexpr'可能是一種方法),但不是預處理器測試。 – 2015-11-25 11:49:37

+0

你也沒有辦法區分空和'TRACING'等於0 – 2018-01-31 10:24:03

+0

'#if'如果沒有找到則定義爲0。這是行不通的 – 2018-01-31 10:30:03

1

遲到了,但我找到了一個不錯的把戲從-DTRACING區分-DTRACING=0

#if (0-TRACING-1)==1 && (TRACING+0)!=-2 
#error "tracing empty" 
#endif 

如果TRACING是空的,表達式的值爲0--1 =>1

如果TRACING爲0時,表達式求0-0-1 =>-1

我加入的情況下TRACING==-2額外的檢查這將使第一試驗合格。

這當然不適用於字符串文字。