3

Минимального кодом большей проблемы:Доступ указатель к элементу данных с помощью макроса результатов в «ошибке: ожидаются безоговорочным идентификатор перед„*“знака»

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» & «ошибки» выглядят одинаково.
Почему эта ошибка связана с макросом?

ответ

1

С лязгом 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; 
} 

можно увидеть пространство в строке:

s. *foo(0) = 0; 

Это пространство является причиной «ожидается unqualified-id before ... ". Само пространство должно быть продуктом token spacing.

Не знаю почему g ++ не показывает пробел. Возможно, это ошибка компилятора, связанная с представлением вывода предварительной обработки.

+0

Ваш анализ кажется правильным для меня. Это скорее ошибка gcc. – iammilind

Смежные вопросы