【发布时间】:2012-06-19 17:15:55
【问题描述】:
我正在使用一个单元测试框架,该框架依赖于 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。 NULL(定义为 0 的宏)在构建断言消息文本之前由 C 预处理器扩展。有没有办法可以忽略或绕过消息文本的扩展?
编辑:对于任何好奇的人来说,这是解决方案:
#define REQUIRE( expr ) INTERNAL_REQUIRE( expr, #expr, "REQUIRE" )
#define INTERNAL_REQUIRE( expr, exprString, macroName ) \
PerformAssertion( macroName, exprString, expr );
【问题讨论】:
-
只使用
INTERNAL_REQUIRE(expr, #expr, "REQUIRE")而不是两个参数的形式?
标签: c++ macros c-preprocessor