C++编译器宏展开模板参数时报错,是否为预期行为?
为什么
EXPECT_EQ(C<A, B>::foo(), true)会触发宏参数过多错误? 这是预期行为,根源在于C预处理器的工作机制:它处理宏时仅做简单文本分割,不会解析C的模板语法。
当你写EXPECT_EQ(C<A, B>::foo(), true)时,预处理器会把所有逗号当作宏参数的分隔符。这里C<A, B>里的逗号会被误判为EXPECT_EQ的第一个参数和第二个参数的分隔点,导致预处理器认为你传入了三个参数:C<A、 B>::foo()、 true,但EXPECT_EQ宏只定义了两个参数,因此触发参数数量不匹配的错误。
解决办法
- 提前存储结果:像你现在做的那样,先调用
foo()并把结果存到变量中,再传入宏:
bool foo_result = C<A, B>::foo(); EXPECT_EQ(foo_result, true);
- 用括号包裹含逗号的参数:预处理器会忽略括号内部的逗号作为参数分隔符,把括号内的内容视为一个整体参数:
EXPECT_EQ( (C<A, B>::foo()), true );
内容的提问来源于stack exchange,提问作者user129393192
相关产品推荐
相关产品推荐

