3

Minimal-Code des größeren Problems:Zugriff Zeiger auf Datenelement „Fehler: erwartet unqualifizierte-ID vor‚*‘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 <--- ?? 
} 

Wenn foo() Methode mit FOO() Makro zu vermeiden "ersetzt * ', dann wird der Fehler im Titel angezeigt. Wenn ich die Vorverarbeitung mit der Option g++ -E überprüfte, dann sehen beide "ok" & "Fehler" -Leitungen gleich aus.
Warum ist dieser Fehler mit Makro?

Antwort

1

Mit Klirren 3.8 ich die nächste Ausgabe für Ihr Programm bekam:

# 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; 
} 

Einer der Platz in der Zeile sehen:

s. *foo(0) = 0; 

Dieser Raum ist der Grund für „erwartet die unqualifizierte ID vor ... "Fehler. Der Raum selbst sollte ein Produkt von token spacing sein.

Ich weiß nicht warum g ++ zeigt nicht den Raum. Möglicherweise ist es ein Compilerfehler, der die Ausgabe der Vorverarbeitung darstellt.

+0

Ihre Analyse scheint mir richtig. Es ist mehr von gcc bug. – iammilind

Verwandte Themen