Plattformübergreifendes Definieren von #define für Makros __FUNCTION__ und __func__
Lesezeit: 3 Minuten
Ameise2009
Kompilieren mit gcc 4.4.2 und WinXP Visual Studio C++ 2008
#if defined ( WIN32 )
#define __FUNCTION__ __func__
#endif
Da ich das Makro verwenden möchte, um den Funktionsnamen anzuzeigen. Ich habe das oben Gesagte getan, damit ich plattformübergreifend und dasselbe verwenden kann Funk beim Kompilieren unter Linux oder Windows.
Wenn ich jedoch unter WinXP kompiliere, erhalte ich die folgende Fehlermeldung:
__func__ undeclared identifier
Kann ich so ein Makro nicht #definieren?
Vielen Dank für Anregungen,
Sie sollten #wenn definiert(_MSC_VER) statt #wenn definiert(_WIN32) verwenden. Die Frage ist nicht, welches Betriebssystem Sie verwenden. Die Frage ist, welchen Compiler Sie verwenden.
– Dale Wilson
17. Januar 2015 um 17:54 Uhr
tomlogik
Es sieht so aus, als hättest du deine #define rückwärts. Wenn Sie verwenden möchten __func__ auf beiden Plattformen und WIN32 hat __FUNCTION__ aber nicht __func__müssen Sie stattdessen Folgendes tun:
#if defined ( WIN32 )
#define __func__ __FUNCTION__
#endif
Möglicherweise gibt es einen besseren Weg, um zu wissen, ob Sie definieren müssen __func__ oder nicht, aber dieser schnelle Hack sollte es tun.
Denken Sie daran, bei Compilern, die die unterstützen __FUNCTION__ und __func__ Schlüsselwörter, sie sind keine Makros, also können Sie Folgendes nicht tun (da #ifndef __func__ ist nicht gültig):
1 Die Kennung __func__ muss vom Übersetzer implizit so deklariert werden, als ob unmittelbar nach der öffnenden geschweiften Klammer jeder Funktionsdefinition die Deklaration
static const char __func__[] = "function-name";
erschien, wobei Funktionsname der Name der lexikalisch einschließenden Funktion ist.
Danke das hat funktioniert. Aber hat mich nachdenklich gemacht. Wenn du das sagst FUNKTION und Funk sind keine Makros. Warum können Sie nicht in einem #define definieren. Wie können wir auch wissen, ob es sich um ein Makro oder ein Schlüsselwort handelt? Danke vielmals.
– Ameise2009
18. Februar 2010 um 2:09 Uhr
Das ist eine gute Frage – ich denke, Sie müssen zur ANSI-Spezifikation (oder Google) gehen, um das herauszufinden. In diesem Fall, __func__ ist ein “vordefinierter Bezeichner” und verhält sich basierend auf der Beschreibung wie eine statische konstante Variable, die in der Funktion definiert ist. In meinem obigen Beispiel ist der Teil, der nicht funktioniert #ifndef __func__ seit __func__ ist kein definiertes Makro, das für den Makro-Präprozessor sichtbar ist.
– Tomlogik
18. Februar 2010 um 19:51 Uhr
Hans Passanten
Das __FUNCTION__ Makro ist im MSVC-Compiler vordefiniert. Sie müssen es so aussehen lassen:
Ich habe das versucht und immer noch den gleichen Fehler. Ich habe dies auch in der Bedingung (MSVC) und bekam den gleichen Fehler. Noch mehr Vorschläge. Vielen Dank.
– Ameise2009
17. Februar 2010 um 16:04 Uhr
Vielleicht liegt es an mir, aber wenn ich diese 2 ausprobiere, bekomme ich den Fehler: “#if[n]def hat eine Kennung erwartet”. Danke.
– Ameise2009
17. Februar 2010 um 16:13 Uhr
@robUK – oops, das Original-Snippet hat mich in Schwierigkeiten gebracht. Fest.
– Hans Passant
17. Februar 2010 um 16:30 Uhr
Danke, ich hätte die Klammern sehen sollen. Ich glaube, ich bin zu sehr daran gewöhnt, das if defined () mit den Klammern zu verwenden.
– Ameise2009
18. Februar 2010 um 2:01 Uhr
Sie sollten in der Lage sein, zu verwenden __func__ ohne explizite Makros in jedem Compiler, der C99 unterstützt.
Ja, ich kann das in c89/c99 verwenden. Visual Studio 2008 verwendet jedoch FUNKTION. Ich habe #define versucht, damit ich dasselbe Makro für Windows und Linux verwenden kann. Vielen Dank.
– Ameise2009
17. Februar 2010 um 15:55 Uhr
sbi
Sie können natürlich #define so ein Makro. Jede Instanz von FUNCTION wird dann ersetzt durch __func__. Offensichtlich weiß Ihr Compiler dies jedoch nicht __func__. Ich glaube, VC weiß es __FUNCTION__Also
#if defined ( WIN32 )
# define __func__ __FUNCTION__
#endif
könnte tun.
12456700cookie-checkPlattformübergreifendes Definieren von #define für Makros __FUNCTION__ und __func__yes
Sie sollten #wenn definiert(_MSC_VER) statt #wenn definiert(_WIN32) verwenden. Die Frage ist nicht, welches Betriebssystem Sie verwenden. Die Frage ist, welchen Compiler Sie verwenden.
– Dale Wilson
17. Januar 2015 um 17:54 Uhr