当宏扩展为空时,临时变量会发生什么?

时间:2012-11-06 03:33:56

标签: c++ macros

#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__ );
    }

1 个答案:

答案 0 :(得分:4)

它将扩展为 -

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

宏分辨率是一个预编译时活动,它只是在编译开始之前将定义替换为代码。

您没有将任何“含义”与宏中的调试动态信息相关联 - 因此根本不使用它。

简单来说,宏在预编译期间只是一种“搜索和替换”类型的活动。现在因为str没有在宏中定义,所以它不是“使用”的。由于它是一种预编译时间活动,因此不会出现临时变量的问题。