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 for
gcc
。它将在预处理阶段后停止,预处理阶段将展开宏并包含。宏应展开为零,但不会在后面吃分号,因此两个示例都不精确。
if ( SomeFunc() )
    {
; //Remember the semicolon here
    }
else
    {
    gLogger.LogFailure("Failure calling SomeFun()", __FILE__, __LINE__ );
    }