Accessing pointer to data member using macro results in "error: expected unqualified-id before ‘*’ token"

Accessing pointer to data member using macro results in "error: expected unqualified-id before ‘*’ token"

大问题的最少代码:

struct S { int i; };
typedef int (S::*Type);

Type foo (int) { return &S::i; }
#define FOO(X) *foo(X)

int main ()
{
  S s;
  s.*foo(0) = 0; // ok
  s.FOO(0) = 0; // error  <--- ?? 
}

如果将 foo() 方法替换为 FOO() 宏以避免出现“*”,则会导致标题中出现错误。当我使用 g++ -E 选项检查预处理时,"ok" 和 "error" 行看起来都一样。
为什么宏会出现这个错误?

使用 clang 3.8 我得到了你程序的下一个输出:

# 1 "test.cpp"
# 1 "<built-in>" 1
# 1 "<built-in>" 3
# 325 "<built-in>" 3
# 1 "<command line>" 1
# 1 "<built-in>" 2
# 1 "test.cpp" 2
struct S { int i; };
typedef int (S::*Type);

Type foo (int) { return &S::i; }


int main ()
{
  S s;
  s.*foo(0) = 0;
  s. *foo(0) = 0;
}

可以看到行中的 space:

s. *foo(0) = 0;

这个 space 是 "expected the unqualified-id before..." 错误的原因。 space 本身应该是 token spacing.

的产物

不知道为什么g++不显示space。可能是关于表示预处理输出的编译器错误。