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。可能是关于表示预处理输出的编译器错误。
大问题的最少代码:
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。可能是关于表示预处理输出的编译器错误。