Plattformübergreifendes Definieren von #define für Makros __FUNCTION__ und __func__

Lesezeit: 3 Minuten

Benutzer-Avatar
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

Benutzer-Avatar
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):

#ifndef __func__
#define __func__ __FUNCTION__
#endif

Aus der C99-Spezifikation:

6.4.2.2 Vordefinierte Identifikatoren

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

Benutzer-Avatar
Hans Passanten

Das __FUNCTION__ Makro ist im MSVC-Compiler vordefiniert. Sie müssen es so aussehen lassen:

#ifndef _MSC_VER
#define __FUNCTION__ __func__
#endif

Oder umgekehrt, wenn Sie es vorziehen:

#ifdef _MSC_VER
#define __func__ __FUNCTION__
#endif

  • 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

Benutzer-Avatar
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.

1245670cookie-checkPlattformübergreifendes Definieren von #define für Makros __FUNCTION__ und __func__

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy