2013-10-03 92 views
2

因此,我有一段代碼,如果它處於調試模式,它將訪問一個DLL名稱空間函數,並且如果它在發佈中,我想註釋掉它。宏以防止代碼處理

#ifdef DEBUG 
     #define (DEBUG_CODE) abcd:: 
#else 
     #define (DEBUG_CODE) <Condition to skip processing> 


     if (some condition) 
       (DEBUG_CODE) func_name(); 

雖然我想了#else定義一個評論,我想你不能這樣做,因爲它們是由編譯器代碼的任何處理前跳過,或進行預處理..

如果這是正確的,那麼請告訴我一種跳過(DEBUG_CODE) func_name();的處理的方法。有很多地方使用它,我不想在任何地方添加if(DEBUG)

編輯

命名空間DLL有不返回任何東西,以及其預期返回值的函數,以及可能被分配到一個enum功能。

abcd::func_name(); 
and 
    int rs = abcd::func_name_2(); 
and 
    enum XYZ{ var1 = 0; var2}; 
    XYZ PQR = abcd::func_name3(); //This Enum will prevent me from defining some kind 
            // 0; as a `#define` 

So..multiple場景..

感謝您的幫助。

+0

也許'if(false)'? –

回答

2

你可以做到這一點,如果你改變DEBUG_CODE

#ifdef DEBUG 
    # define DEBUG_CODE(code) abcd::code; 
    #else 
    # define DEBUG_CODE(code) ; 
    #endif 

,然後你會這樣稱呼它:

if(some_condition) DEBUG_CODE(func_name()) 

在調試模式下,該調用你的函數,並在釋放模式無碼產生。

如果你想能夠將這些函數的返回值賦給變量或從它們返回(儘管我不認爲這是一個好主意,正如我在評論中解釋的那樣),我會讓宏接受調用調試模式以及在發佈模式下使用什麼。

#ifdef DEBUG 
    # define IF_DEBUG_ELSE(debug_code, release_code) abcd::debug_code 
    #else 
    # define IF_DEBUG_ELSE(debug_code, release_code) release_code 
    #endif 

這至少在你調用宏時發生了什麼。
這可以用於像:

return IF_DEBUG_ELSE(check_result(), 0);//0 for success 
    if(IF_DEBUG_ELSE(check_condition(), true)){} 
    XYZ xyz = IF_DEBUG_ELSE(get_xyz(), First_XYZ); 

等等這樣的。

+0

這可能運行良好,除了在某些情況下,'func_name()'被用作表達式來返回要分配的值。例如'int rs = abcd :: code'。如果它被'#define'替代,那麼它將等於int rs =;。我可以這樣做:#define DEBUG_CODE(code)0;',但是'rs'也可以是Enum。我將編輯該問題以反映不同的情況。 – user1173240

+2

@ user1173240這似乎是一個壞主意,調試代碼應該用於額外的檢查以幫助開發。如果您開始返回這些錯誤值並在開發期間開始依賴它們(或者其他人沒有意識到它們只是調試檢查),則代碼將無法按預期工作。 – SirGuy

+0

@GuyGear我知道,但這是代碼的一箇舊部分,它正在被簡化。對於發行版本,它需要更長的'abcd' DLL,但我們需要它來進行調試,否則開發將會受到影響。我試圖用一些草率的設計來應付最佳狀態。無論如何,「if(DEBUG)」是不可避免的,我只想要一個更清晰的方式來做到這一點。 – user1173240