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

1 回答 1

4

它将扩展到-

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

宏解析是一个预编译时活动,它只是在编译开始之前将定义替换到代码中。

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

简而言之,宏只是预编译期间的一种“搜索和替换”活动。现在由于 str 没有在宏中定义,它没有被“使用”。由于它是一种预编译时活动,因此不会出现临时变量的问题。

于 2012-11-06T03:56:47.503 回答