我正在使用一个依赖REQUIRE
宏来执行断言的单元测试框架。
简化后,宏的工作方式如下:
#define REQUIRE( expr ) INTERNAL_REQUIRE( expr, "REQUIRE" )
其定义类似于:
#define INTERNAL_REQUIRE( expr, macroName ) \
PerformAssertion( macroName, #expr, expr );
PerformAssertion
的前两个参数的类型为:const char*
. 第二个参数 ( #expr
) 的原因是可以记录断言的确切表达式。这就是问题所在。预处理器在将表达式作为 a 传递之前对其进行扩展const char *
,因此它与最初断言的表达式不同。
例如:
REQUIRE( foo != NULL );
将导致此调用:
PerformAssertion( "REQUIRE", "foo != 0", foo != 0 );
如您所见,表达式被部分扩展,例如表达式foo != NULL
在日志中显示为foo != 0
. 在构建断言消息文本之前,C 预处理器扩展了NULL
(定义为 be 的宏)。0
有没有办法可以忽略或绕过消息文本的扩展?
编辑:对于任何好奇的人来说,这是解决方案:
#define REQUIRE( expr ) INTERNAL_REQUIRE( expr, #expr, "REQUIRE" )
#define INTERNAL_REQUIRE( expr, exprString, macroName ) \
PerformAssertion( macroName, exprString, expr );