#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__ );
}
答案 0 :(得分:4)
它将扩展为 -
if ( SomeFunc() )
{
; //Remember the semicolon here
}
else
{
gLogger.LogFailure("Failure calling SomeFun()", __FILE__, __LINE__ );
}
宏分辨率是一个预编译时活动,它只是在编译开始之前将定义替换为代码。
您没有将任何“含义”与宏中的调试动态信息相关联 - 因此根本不使用它。
简单来说,宏在预编译期间只是一种“搜索和替换”类型的活动。现在因为str没有在宏中定义,所以它不是“使用”的。由于它是一种预编译时间活动,因此不会出现临时变量的问题。