C++ 编译器在宏扩展中存在模板参数问题

问题描述 投票:0回答:1

我对

g++
clang++
进行了测试,并在今天早些时候编写一些单元测试时经历了这一点,并得出了 MWE:

#define EXPECT_EQ(A, B)

template <typename A, typename B>
class C {
public:
  static bool foo() { return true; }
};

class A { };
class B { };
int main() {
  EXPECT_EQ(C<A, B>::foo(), true);
}

编译器错误是

too many arguments provided to function-like macro invocation
或更具描述性的
macro "EXPECT_EQ" passed 3 arguments, but takes just 2

这是预期的行为吗?我注意到我必须通过在宏之前简单地调用

foo()
来解决这个问题。

c++ g++ clang++
1个回答
0
投票

宏在编译器运行之前由预处理器处理,因此它们无法识别复杂的 C++ 语言语法,例如模板。宏参数严格以逗号分隔,因此语句:

EXPECT_EQ(C<A, B>::foo(), true);

被解释为传入了 3 个参数:

C<A

B>::foo()

true

因此出现“提供了太多参数”错误。

© www.soinside.com 2019 - 2024. All rights reserved.