2009-05-20 3 views
0

Ich habe ein sehr einfaches Makro, das ich für Kurzschreibweise verwende, wenn Ausnahmen erklärt werden. Im Debug-Modus fügt es die aktuelle Datei- und Zeilennummer hinzu.Fehler "undeclared identifier" in der einfachen Makroerweiterung

Ich bin dabei, meinen Code zu ändern, um Unicode zu unterstützen, und plötzlich erhalte ich "undeclared identifier" -Fehler, wenn mein Makro verwendet wird. Ich vermisse wahrscheinlich etwas wirklich Einfaches, da das Makro selbst ziemlich einfach ist. Kann jemand sagen, was das Problem ist?

Hier ist die Makro-Deklaration:

#ifdef _DEBUG 
#define EXCEPTION(msg, mm) Exception(msg, mm, _T(__FILE__), _T(__LINE__)) 
#else 
#define EXCEPTION(msg, mm) Exception(msg, mm) 
#endif 

Ich glaube nicht, es ist notwendig, aber nur für den Fall, hier ist die Exception-Konstruktor-Deklaration:

Exception(LPCTSTR msg, BOOL manageMsg = FALSE, LPCTSTR f = NULL, int l = -1); 

Wenn im Release-Modus kompiliert I don‘ t irgendwelche Fehler zu bekommen, aber wenn ich im Debug-Modus ich, also ist es etwas mit den __FILE__ und __LINE__ Bits, aber ich kann nicht herausfinden, was das eigentliche Problem ist.

+0

Veröffentlichen Sie die vollständige aktuelle Fehlermeldung, ein Beispiel dafür, wie Sie das Makro verwenden, und eine Angabe, welche Zeile in Ihrem Code den Fehler verursacht. –

+0

Das * ist * der volle Fehler. Deshalb konnte ich nicht herausfinden, welcher Teil davon das Problem war. Es gab nichts anderes in der Fehlermeldung. – Herms

Antwort

3

Das __LINE__ Makro wird zu einer Ganzzahl ausgewertet. Das _T Makro setzt eine L auf der Vorderseite von Zeichenfolgen, um sie Unicode-Zeichenfolgen zu erstellen. Es folgt ein öffnendes doppeltes Anführungszeichen wie L"file.cpp". In Ihrem Fall folgt jedoch das Ganzzahlliteral, das __LINE__ erweitert. Sie erhalten so etwas: L23. Befreien Sie sich von dem zweiten Anruf _T.

#define EXCEPTION(msg, mm) Exception(msg, mm, _T(__FILE__), __LINE__) 

Diese mehr haben könnte leicht, wenn Sie den Namen der Kennung enthalten hatte diagnostiziert, dass der Compiler nicht erkennen. Compiler fügen diese Informationen normalerweise in ihre Fehlermeldungen ein.

+0

Es gab keinen Namen. Der gesamte Fehler ist "nicht deklarierter Bezeichner". Deshalb konnte ich es nicht herausfinden. – Herms

+0

Das war es. Ich war etwas übereifrig mit meinen Ergänzungen des _T() Makros. Ich wusste, es war etwas dummes! – Herms

2

Das war nicht genau das gleiche Problem, das ich hatte, aber ich posten die Lösung für mein Problem hier, weil ich bei meinen Untersuchungen auf diese Frage stieß.

Wenn diese Fehlermeldung bei einem mehrzeiligen Makro auftritt, aktivieren Sie in Ihrem Editor sichtbares Leerzeichen. Sie haben Leerzeichen nach den ‚\‘ Fortsetzungszeichen am Ende der Leitung:

#define FOO_BAR(aFoo) \ 
    FOO_BASE(aFoo, "bar") 

Der Raum am Ende bewirkt, dass der Parser die erste Zeile der Makrodefinition analysieren als kompletten (FOO_BAR erweitert zu ‚\ '), und die zweite Zeile wird als Funktionsdeklaration interpretiert, daher "nicht deklarierter Bezeichner' aFoo '").