我正在使用一个单元测试框架,该框架依赖于 REQUIRE
宏来执行断言。
简单来说,这个宏的功能如下:
#define REQUIRE( expr ) INTERNAL_REQUIRE( expr, "REQUIRE" )
这个定义与以下类似:
#define INTERNAL_REQUIRE( expr, macroName ) \
PerformAssertion( macroName, #expr, expr );
PerformAssertion
的前两个参数是const char*
类型。第二个参数(#expr
)的原因是为了记录被断言的确切表达式。问题就在这里,预处理器在将表达式作为const char *
传递之前会扩展表达式,因此它不是最初断言的相同表达式。
例如:
REQUIRE( foo != NULL );
会导致这个调用:
PerformAssertion( "REQUIRE", "foo != 0", foo != 0 );
如您所见,表达式已部分展开,例如日志中的表达式
foo != NULL
被展开为foo != 0
。在构建断言消息文本之前,C预处理器扩展了NULL
(这是一个定义为0
的宏)。我是否有办法忽略或绕过消息文本的扩展?编辑:以下是解决方案,供任何感兴趣的人参考:
#define REQUIRE( expr ) INTERNAL_REQUIRE( expr, #expr, "REQUIRE" )
#define INTERNAL_REQUIRE( expr, exprString, macroName ) \
PerformAssertion( macroName, exprString, expr );
INTERNAL_REQUIRE(expr,#expr,"REQUIRE")
而不是两个参数形式吗? - kennytm