gpt4 book ai didi

c++ - 不需要的 C 预处理器宏扩展

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:28:26 25 4
gpt4 key购买 nike

我正在使用依赖于 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 != 0NULL(定义为 0 的宏)在构建断言消息文本之前由 C 预处理器展开。有什么方法可以忽略或绕过消息文本的扩展吗?

编辑:对于任何好奇的人来说,这是解决方案:

#define REQUIRE( expr ) INTERNAL_REQUIRE( expr, #expr, "REQUIRE" )

#define INTERNAL_REQUIRE( expr, exprString, macroName ) \
PerformAssertion( macroName, exprString, expr );

最佳答案

尝试在调用内部要求之前进行字符串化。您的问题是它在扩展 NULL 的第二个扩展中被传递给内部要求。如果您在此之前进行字符串化,例如在require宏中,它不会展开NULL。

关于c++ - 不需要的 C 预处理器宏扩展,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11106023/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com