アサーションを実行するためにREQUIRE
マクロに依存するユニットテストフレームワークを使用しています。簡易不要なCプリプロセッサマクロ展開
は、このようなマクロ作品:これと同じ定義さ
#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);
2つの引数の形式の代わりに 'INTERNAL_REQUIRE(expr、#expr、" REQUIRE ")'を使用するだけですか? – kennytm
うん、それはやるよ。 – Jeff