2012-11-06 124 views
0
#ifdef _DEBUG 
// calls appropriate functions for message logging 
#define LOGMESSAGE(stdStr) gLogger.LogMessage(stdStr, __FILE__, __LINE__); 
// calls appropriate function for success logging 
#define LOGSUCCESS(stdStr) gLogger.LogSuccess(stdStr, __FILE__, __LINE__); 
// calls appropriate function for error logging 
#define LOGFAILURE(stdStr) gLogger.LogFailure(stdStr, __FILE__, __LINE__); 
#endif 

#ifdef NDEBUG 
// does nothing in release mode 
#define LOGMESSAGE(stdStr) 
// does nothing in release mode 
#define LOGSUCCESS(stdStr) 
// Logs failures in release mode 
#define LOGFAILURE(stdStr) gLogger.LogFailure(stdStr, __FILE__, __LINE__); 
#endif 

說我叫宏像下面當宏擴展到什麼程度時臨時變量會發生什麼?

if (SomeFunc()) 
    { 
    LOGSUCCESS("Success calling SomeFun()"); 
    } 
else 
    { 
    LOGFAILURE("Failure calling SomeFun()"); 
    } 

在釋放模式LOGSUCCESS是空白這是否意味着「成功調用SomeFunc()」字符串沒有編譯成代碼,將不存在在編譯的代碼中,還是遺留下來的,但宏沒有做任何事情呢?

編輯: 我的意思是它有效地讓這樣的代碼在釋放模式?

if (SomeFunc()) 
    { 
    "Success calling SomeFun()"; 
    } 
else 
    { 
    gLogger.LogFailure("Failure calling SomeFun()", __FILE__, __LINE__); 
    } 

if (SomeFunc()) 
    { 

    } 
else 
    { 
    gLogger.LogFailure("Failure calling SomeFun()", __FILE__, __LINE__); 
    } 
+6

運行預處理程序,看看自己! –

+0

這兩件事情沒有區別。沒有任何效果的東西根本就沒有區別。 –

+0

你是什麼意思運行預處理器? – EddieV223

回答

4

將擴大到 -

if (SomeFunc()) 
    { 
; //Remember the semicolon here 
    } 
else 
    { 
    gLogger.LogFailure("Failure calling SomeFun()", __FILE__, __LINE__); 
    } 

宏分辨率是預先編譯時間的活動,剛剛替換定義成代碼編譯開始前。

您沒有任何關聯「意思是」在宏觀您調試動態信息 - 所以它根本不使用。

說得簡單來看,宏只是預編譯過程中「查找和替換」之類的活動。現在由於str沒有在宏中定義,所以它不被「使用」。由於它是一種預編譯時間活動,因此不會出現臨時變量的問題。

相關問題