2011-12-30 54 views
4

我有一個系統,我可以在命令行中指定詳細級別。在我的功能,我覈對指定什麼來確定,如果我輸入一個代碼塊或不:讓預處理器處理一段代碼

#ifdef DEBUG 
if (verbose_get_bit(verbose_level_1)) { 
    // arbitrary debugging/printing style code generally goes in here, e.g.: 
    printf("I am printing this because it was specified and I am compiling debug build\n"); 
} 
#endif 

我想使這個成立還不繁瑣,所以這裏是我到目前爲止有:

// from "Verbose.h" 
bool verbose_get_bit(verbose_group_name name); // verbose_group_name is an enum 
#ifdef DEBUG 
#define IF_VERBOSE_BIT_D(x) if (verbose_get_bit(x)) 
#else // not debug: desired behavior is the entire block that follows gets optimized out 
#define IF_VERBOSE_BIT_D(x) if (0) 
#endif // not debug 

現在,我可以這樣做:

IF_VERBOSE_BIT_D(verbose_GL_debug) { 
    printf("I don't want the release build to execute any of this code"); 
    glBegin(GL_LINES); 
    // ... and so on 
} 

我喜歡這個,因爲它看起來像一個if語句,它被用作一個if語句,很明顯,這是一個宏,它不在發佈版本中運行。

我會合理地確信代碼將被優化,因爲它將被封裝在if(false)塊中,但如果有某種方式我可以讓預處理器實際上將整個塊扔掉,我寧願它。可以做到嗎?

+0

請清楚聲明「verbose_get_bit」之外的語句(如果有的話)可能會有所不同。 – outis 2011-12-30 00:52:15

+0

@ BrianTompsett-湯萊恩:這不適用於C++嗎? – usr2564301 2016-04-05 20:21:33

回答

2

我想不出一種方法來做到這一點,而沒有包裹整個宏塊。

但是,這可能會滿足您的需要:

#if DEBUG 
#define IF_VERBOSE_BIT_D(x) {x} 
#else 
#define IF_VERBOSE_BIT_D(x) 
#endif 

IF_VERBOSE_BIT_D(
    cout << "this is" << endl; 
    cout << "in verbose" << endl; 
    printf("Code = %d\n", 1); 
) 

事實上,編譯器應該能夠優化出if (0),但我經常做一些類似的,當塊中的代碼將不能編譯當不在調試模式時。

+0

我不知道整個塊可能被用作宏參數。如果定義了具有多個參數的宏,並且在發送給該宏的塊的中間有逗號,該怎麼辦?無論如何,這絕對是一個選項,雖然看起來很奇怪。 – 2011-12-30 00:51:34

+0

即使在塊中的逗號之間,它實際上仍然可以工作。無論哪種方式,如果您需要多個語句,您需要用'{}'來包裝它。 – Mysticial 2011-12-30 00:54:36

+0

所以預處理器會根據'{}'跟蹤範圍嗎?很高興知道。 – 2011-12-30 00:57:47

1

沒有任何地方像你剛剛做的那樣整齊。別擔心,編譯器會全面優化任何if(0)塊。

如果你願意的話,你可以通過編寫一個程序來檢查它,如你所描述的那樣,並編譯它。如果刪除if(false)塊,它應該編譯爲完全相同的二進制文件,如MD5散列所示。但這不是必要的,我保證你的編譯器可以搞清楚它!

+0

這是一個很好的無痛檢查方法。謝謝! – 2011-12-30 00:47:29

+0

許多編譯器(包括VC++)在重複編譯時都不會生成來自相同源的逐字節相同的二進制文件。 – ildjarn 2011-12-30 00:49:43

+0

的確如此,但是如果讓程序儘可能簡單,那麼它更有可能。 – Dan 2011-12-30 00:54:49

-1

剛剛創建的if語句是一個條件開頭「假& &」,如果你想擁有它完全禁用。除非您沒有進行任何優化編譯,否則編譯器通常會刪除死代碼

+0

我已經在很多場合做過很多次了,作爲一種快速的方式來「評論出「一些代碼。 – 2011-12-30 00:49:55