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 に答える