REQUIRE
アサーションを実行するためにマクロに依存する単体テスト フレームワークを使用しています。
簡略化すると、マクロは次のように機能します。
#define REQUIRE( expr ) INTERNAL_REQUIRE( expr, "REQUIRE" )
これは次のように定義されています。
#define INTERNAL_REQUIRE( expr, macroName ) \
PerformAssertion( macroName, #expr, expr );
PerformAssertion
の最初の 2 つのパラメーターの型はconst char*
. 2 番目のパラメーター ( ) の理由は、#expr
アサートされた正確な式をログに記録できるようにするためです。ここに問題があります。プリプロセッサは、 として渡される前に式を展開するconst char *
ため、最初にアサートされた式と同じではありません。
例えば:
REQUIRE( foo != NULL );
この呼び出しは次のようになります。
PerformAssertion( "REQUIRE", "foo != 0", foo != 0 );
ご覧のとおり、式は部分的に展開されています。たとえば、式foo != NULL
はログに として表示されますfoo != 0
。(NULL
と定義されたマクロ0
) は、アサーション メッセージ テキストを作成する前に、C プリプロセッサによって展開されました。メッセージ テキストの展開を無視またはバイパスする方法はありますか?
編集:好奇心旺盛な人のための解決策は次のとおりです。
#define REQUIRE( expr ) INTERNAL_REQUIRE( expr, #expr, "REQUIRE" )
#define INTERNAL_REQUIRE( expr, exprString, macroName ) \
PerformAssertion( macroName, exprString, expr );