2010-02-17 4 views
17

compilazione con gcc 4.4.2 e WinXP Visual Studio C++ 2008multipiattaforma definizione #define per le macro __FUNCTION__ e __func__

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

come voglio utilizzare la macro per visualizzare il nome della funzione. Ho fatto quanto sopra così posso multipiattaforma e usare la stessa funzione durante la compilazione su linux o windows.

Tuttavia, quando sono la compilazione su WinXP ottengo il seguente errore:

__func__ undeclared identifier 

Posso non #define una macro come questa?

Molte grazie per qualsiasi suggerimento,

+3

È necessario utilizzare #if definito (_MSC_VER) anziché #if definito (_WIN32). La domanda non è quale sistema operativo stai usando. La domanda è quale compilatore stai usando. –

risposta

24

Sembra che avete la vostra #define all'indietro. Se si desidera utilizzare __func__ su entrambe le piattaforme, e Win32 ha __FUNCTION__ ma non __func__, è necessario fare questo, invece:

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

Ci può essere un modo migliore per sapere se è necessario definire __func__ o no, ma questo trucco veloce dovrebbe fare il trucco.

Ricordate, su compilatori che supportano le __FUNCTION__ e __func__ parole chiave, non sono le macro quindi non è possibile effettuare le seguenti operazioni (dal #ifndef __func__ non è valido):

#ifndef __func__ 
#define __func__ __FUNCTION__ 
#endif 

Dal spec C99:

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

Grazie a quello ha funzionato. Ma mi ha fatto pensare. Quando dici che __FUNCTION__ e __func__ non sono macro. Perché non puoi definire in un #define. Inoltre, come possiamo sapere se si tratta di una macro o di una parola chiave? Grazie molto. – ant2009

+1

Questa è una buona domanda - Suppongo che tu debba andare alle specifiche ANSI (o Google) per scoprirlo. In questo caso, '__func__' è un" identificatore predefinito "e basato sulla descrizione, si comporta come una variabile const statica definita nella funzione. Nel mio esempio precedente, la parte che non funziona è '#ifndef __func__' poiché' __func__' non è una macro definita visibile al pre-processore macro. – tomlogic

1

Ovviamente si può #define come una macro. Ogni istanza di FUNCTION viene quindi sostituita da __func__. Tuttavia, obviosuly il tuo compilatore non sa __func__. Credo VC sa __FUNCTION__, così

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

potrei fare.

+0

Siamo spiacenti, ma non ha funzionato. Grazie. – ant2009

+0

'__FUNCTION__' non è una macro, quindi non puoi avere #ifdef su di esso. Come con '__func__', è una parola chiave per il compilatore o non lo è. – tomlogic

+0

@tomlogic: Sì, hai ragione. L'ho riparato. – sbi

2

Dovresti essere in grado di utilizzare __func__ senza macro esplicite in alcun compilatore che supporti C99.

+1

Sì, posso usarlo in c89/c99. Tuttavia, Visual Studio 2008 utilizza __FUNCTION__. Stavo cercando #define in modo che io possa usare la stessa macro per Windows e Linux. Grazie. – ant2009

6

La macro __FUNCTION__ è predefinita nel compilatore MSVC. Avrete bisogno di far sembrare questo:

#ifndef _MSC_VER 
#define __FUNCTION__ __func__ 
#endif 

O viceversa, se si preferisce:

#ifdef _MSC_VER 
#define __func__ __FUNCTION__ 
#endif 
+0

L'ho provato e ho ancora lo stesso errore. Ho anche provato questo anche nelle condizioni (__MSVC__), e ho ottenuto lo stesso errore.Altri suggerimenti. Grazie. – ant2009

+0

Forse sono io, ma quando provo quelli 2 ottengo l'errore: "#if [n] def si aspettava un identificatore". Grazie. – ant2009

+0

@robUK - oops, lo snippet originale mi ha messo nei guai. Fisso. –