2010-02-17 9 views
17

Kompilieren mit gcc 4.4.2 und WinXP Visual Studio C++ 2008Plattformübergreifend für Makros definieren #define __FUNCTION__ und __FUNC__

#if defined (WIN32) 
#define __FUNCTION__ __func__ 
#endif 

Wie ich möchte das Makro verwenden, um die Funktionsnamen angezeigt werden soll. Ich habe das oben genannte getan, also kann ich plattformübergreifend arbeiten und dasselbe func beim Kompilieren auf Linux oder Windows verwenden.

Allerdings, wenn ich auf WinXP bin Kompilieren ich die folgende Fehlermeldung erhalten:

__func__ undeclared identifier 

Kann ich ein Makro wie diese nicht #define?

Vielen Dank für Ihre Anregungen,

+3

Sie sollten #if defined (_MSC_VER) anstelle von #if defined (_WIN32) verwenden. Die Frage ist nicht, welches Betriebssystem Sie verwenden. Die Frage ist, welchen Compiler Sie verwenden. –

Antwort

24

Es sieht aus wie Sie Ihre #define nach hinten haben. Wenn Sie __func__ auf beiden Plattformen verwenden möchten, und WIN32 hat __FUNCTION__ aber nicht __func__, müssen Sie diese stattdessen tun:

#if defined (WIN32) 
#define __func__ __FUNCTION__ 
#endif 

Es kann eine bessere Art und Weise zu wissen, ob Sie __func__ oder nicht definieren müssen, aber Dieser schnelle Hack sollte den Trick machen.

Denken Sie daran, auf Compiler, der die __FUNCTION__ und __func__ Schlüsselwörter unterstützen, sie sind keine Makros, so dass Sie nicht tun können, die folgenden (seit #ifndef __func__ ist nicht gültig):

#ifndef __func__ 
#define __func__ __FUNCTION__ 
#endif 

Von der C99-Spezifikation:

6.4.2.2 Predefined identifiers

1 The identifier __func__ shall be implicitly declared by the translator as if, immediately following the opening brace of each function definition, the declaration

static const char __func__[] = "function-name"; 

appeared, where function-name is the name of the lexically-enclosing function.

+0

Danke das hat funktioniert. Aber hat mich zum Nachdenken gebracht. Wenn Sie sagen, dass __FUNCTION__ und __func__ keine Makros sind. Warum kannst du nicht in #define definieren? Wie können wir wissen, ob es sich um ein Makro oder ein Schlüsselwort handelt? Danke vielmals. – ant2009

+1

Das ist eine gute Frage - ich denke, Sie müssen auf die ANSI-Spezifikation (oder Google) gehen, um herauszufinden. In diesem Fall ist "__func__" ein "vordefinierter Bezeichner" und verhält sich auf Grundlage der Beschreibung wie eine statische Konstante, die in der Funktion definiert ist. In meinem obigen Beispiel ist der Teil, der nicht funktioniert, '#ifndef __func__', da' __func__' kein definiertes Makro ist, das für den Makro-Preprozessor sichtbar ist. – tomlogic

1

Sie können natürlich #define ein solches Makro. Jede Instanz von FUNCTION wird dann durch __func__ ersetzt. Wie auch immer, offensichtlich weiß Ihr Compiler nicht __func__. Ich glaube, VC weiß __FUNCTION__, so

#if defined (WIN32) 
# define __func__ __FUNCTION__ 
#endif 

tun könnte.

+0

Sorry, aber das hat auch nicht funktioniert. Vielen Dank. – ant2009

+0

'__FUNCTION__' ist kein Makro, Sie können also kein #ifdef haben. Wie bei '__func__' ist es entweder ein Schlüsselwort für den Compiler oder nicht. – tomlogic

+0

@tomlogic: Ja, du hast recht. Ich habe es repariert. – sbi

2

Sie sollten __func__ ohne explizite Makros in jedem Compiler, der C99 unterstützt, verwenden können.

+1

Ja, ich kann das in c89/c99 verwenden. Visual Studio 2008 verwendet jedoch __FUNCTION__. Ich habe versucht #define, so dass ich das gleiche Makro für Windows und Linux verwenden kann. Vielen Dank. – ant2009

6

Das Makro __FUNCTION__ ist im MSVC-Compiler vordefiniert. Sie benötigen, um es so aussehen zu lassen:

#ifndef _MSC_VER 
#define __FUNCTION__ __func__ 
#endif 

Oder umgekehrt, wenn Sie es vorziehen:

#ifdef _MSC_VER 
#define __func__ __FUNCTION__ 
#endif 
+0

Ich habe das versucht, und immer noch den gleichen Fehler. Ich habe das auch in der Bedingung (__MSVC__) versucht und den gleichen Fehler bekommen.Noch mehr Vorschläge. Vielen Dank. – ant2009

+0

Vielleicht ist es mir, aber wenn ich diese 2 versuche, bekomme ich den Fehler: "#if [n] def erwartet einen Identifier". Vielen Dank. – ant2009

+0

@robUK - oops, das Originalstück hat mich in Schwierigkeiten gebracht. Fest. –