C++ 当宏扩展为空时,临时变量会发生什么情况?
假设我调用宏,如下所示C++ 当宏扩展为空时,临时变量会发生什么情况?,c++,macros,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.LogSucc
#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
在发布模式下,LOGSUCCESS为空,那么这是否意味着“Success calling SomeFunc()”字符串未编译到代码中,也不会存在于已编译的代码中,或者这是遗留下来的,但宏不会对其执行任何操作
编辑:
我的意思是,它是否能有效地让代码像这样处于发布模式
if ( SomeFunc() )
{
LOGSUCCESS("Success calling SomeFun()");
}
else
{
LOGFAILURE("Failure calling SomeFun()");
}
或
该计划将扩展至-
if ( SomeFunc() )
{
}
else
{
gLogger.LogFailure("Failure calling SomeFun()", __FILE__, __LINE__ );
}
宏解析是一个编译前活动,它只是在编译开始之前将定义替换到代码中
您没有将任何“含义”与宏中的调试动态信息相关联,因此根本不使用它
简单地说,宏只是预编译期间的一种“搜索和替换”活动。现在,由于str未在宏中定义,因此它未被“使用”。由于它是一种预编译时活动,因此不会出现临时变量的问题。它将扩展到-
if ( SomeFunc() )
{
}
else
{
gLogger.LogFailure("Failure calling SomeFun()", __FILE__, __LINE__ );
}
宏解析是一个编译前活动,它只是在编译开始之前将定义替换到代码中
您没有将任何“含义”与宏中的调试动态信息相关联,因此根本不使用它
简单地说,宏只是预编译期间的一种“搜索和替换”活动。现在,由于str未在宏中定义,因此它未被“使用”。因为它是一种预编译时活动,所以不会出现临时变量的问题。运行预处理器,自己看看!这两件事没有区别。实际上没有效果的东西与没有的东西是无法区分的。你说的运行预处理器是什么意思?@EddieV223:Use-E flag for
gcc
。它将在预处理阶段后停止,该阶段将展开宏并包含。宏应展开为零,但它不会在之后吃分号,因此两个示例都不精确。运行预处理程序并亲自查看!这两件事没有区别。实际上没有效果的东西与没有的东西是无法区分的。你说的运行预处理器是什么意思?@EddieV223:Use-E flag forgcc
。它将在预处理阶段后停止,预处理阶段将展开宏并包含。宏应展开为零,但不会在后面吃分号,因此两个示例都不精确。
if ( SomeFunc() )
{
; //Remember the semicolon here
}
else
{
gLogger.LogFailure("Failure calling SomeFun()", __FILE__, __LINE__ );
}