C++ 使用宏访问指向数据成员的指针会导致;错误:在‘之前应为不合格id*’;代币;

C++ 使用宏访问指向数据成员的指针会导致;错误:在‘之前应为不合格id*’;代币;,c++,compiler-errors,macros,c-preprocessor,pointer-to-member,C++,Compiler Errors,Macros,C Preprocessor,Pointer To Member,更大问题的最小代码: 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 <--- ?? } 结构{int i;}; typedef int(S::*Type); 键入foo(int){r

更大问题的最小代码:

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  <--- ?? 
}
结构{int i;}; typedef int(S::*Type); 键入foo(int){return&S::i;} #定义FOO(X)*FOO(X) int main() { S S; s、 *foo(0)=0;//确定 s、 FOO(0)=0;//错误与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;
}
此空格是“在…之前应为非限定id”错误的原因。空格本身应为的产品


我不知道为什么g++没有显示空格。可能是一个关于表示预处理输出的编译器错误。

我认为你的分析是正确的。更多的是gcc错误。
s. *foo(0) = 0;