2010-02-06 17 views
5

Oltre a __LINE__ e __FILE__, esistono altre macro predefinite utili, come __FUNCTION_NAME__?C/C++ definizioni di macro fredde?

In caso contrario, ma si conoscono altre macro definite utili/utili (soprattutto per scopi di debug), mi piacerebbe sentirle.

Alcuni hanno chiesto informazioni sulla piattaforma: sto utilizzando gcc/g ++ su MacOSX.

+1

Questo sarà specifico della piattaforma. su quale piattaforma sei? – dirkgently

+1

@dirkgently: '__LINE__' e' __FILE__' non sono specifici della piattaforma. E penso che ci siano altre cose simili a macro ('__FUNCTION_NAME__' non è una macro) che fanno anche parte dello standard C e/o C++. – Omnifarious

+0

@Onniversario: Sì, ne sono a conoscenza. Dal momento che sta cercando altri, quindi la mia domanda. – dirkgently

risposta

7

posso trovare i seguenti (descrizioni da progetto C99, ma sono disponibili in C89 troppo credo):

  • __DATE__: La data di traslazione del gruppo di traduzione di pre-elaborazione: una stringa di caratteri letterale la forma "Mmm gg aaaa", dove i nomi dei mesi sono gli stessi di quelli generati dalla funzione asctime, e il primo carattere di dd è un carattere di spazio se il valore è minore di 10. Se la data la traduzione non è disponibile, deve essere fornita una data valida definita dall'implementazione .
  • __TIME__: Il tempo di traslazione del gruppo di traduzione preelaborazione: una stringa di caratteri letterale della forma "hh: mm: ss" come nel tempo generato dalla funzione asctime. Se l'ora della traduzione non è disponibile, deve essere fornito un orario valido definito dall'implementazione .

Per il nome della funzione corrente, C99 definisce __func__, ma __FUNCTION_NAME__ non è una macro standard. Inoltre, __func__ non è una macro, si tratta di un identificatore riservato (6.4.2.2p1):

L'identificatore __func__ viene implicitamente dichiarato dal traduttore, come se, subito dopo la coppia di ogni definizione di funzione di apertura, dichiarazione

static const char __func__[] = "nomefunzione";

apparso, dove nome-funzione è il nome del functi lessicalmente racchiude sopra.

Se stai cercando qualcosa che sia specifico per la piattaforma: ecco un elenco di gcc's common predefined macros. Mi piace lo __COUNTER__, che è un numero intero sequenziale unico a partire da 0. Penso che lo __INCLUDE_LEVEL__ sia anche bello, ma non sono sicuro se posso ancora pensare a un suo utilizzo :-).

+0

'__DATE__' e' __TIME__' sono disponibili anche in C++. – sbi

+0

@sbi, grazie per l'informazione. –

+0

La ricorsione '# include' potrebbe essere terminata da' __INCLUDE_LEVEL__'. – Potatoswatter

1

Se non mi sbaglio, __func__ non è una macro. È fondamentalmente un nome dichiarato come static const char * const __func__ = "function_name"; nella parte superiore di qualsiasi funzione in cui viene utilizzato. E dovresti usare __func__ invece di qualsiasi cosa come __FUNCTION_NAME__ perché lo __func__ fa parte dello standard C99.

+0

Si sta sbagliando: il costrutto C99 è chiamato '__func__'. –

+0

'__FUNCTION__' è una macro su MSVC. –

+0

@Chris Lutz, grazie. Penso che la mia risposta sia corretta ora. :-) – Omnifarious

2

Quello specifico che stai cercando si chiama __func__, ma non è esattamente una macro, poiché il suo significato cambia a seconda di dove è visto. È utile, tuttavia, e sembra una macro.

mio macro preferito al momento è __STDC_VERSION__ perché mi permette di fare questo:

#if !defined(__STDC_VERSION__) || __STDC_VERSION__ < 199901L 
# define inline 
# define register 
# if __GNUC__ >= 2 || _MSC_VER >= 1300 
# define __func__ __FUNCTION__ 
# else 
# define __func__ "<unknown>" 
# endif 
#endif 

Ora è possibile utilizzare le parole chiave C99 inline, register e __func__ a dichiarare le cose senza doversi preoccupare se o non il compilatore che stai utilizzando supporta la funzionalità C99! In realtà, il bit per inline è più complesso in quanto alcuni compilatori definiscono __inline e altre sciocchezze simili, ma si ottiene l'idea generale.

Inoltre, è possibile trovare un utile elenco di macro predefinite per l'identificazione di compilatori, sistemi operativi e architetture here.

+1

Chris, anche il significato di '__LINE__' cambia a seconda di dove è visto, quindi l'espansione di un nome dipende da dove viene vista nella sorgente, non implica necessariamente che non possa essere una macro. Hai ragione sul fatto che '__func__' non è una macro, ovviamente. –

+0

+1 per condividere il link sourceforge con noi. – bkausbk

0

È possibile ottenere tutti i regolari macro predefinite da gcc come questo:

$ gcc -dM -E - < /dev/null 

Naturalmente questo non include le macro speciali come:

__FILE__, __LINE__ and __FUNCTION__. 
0

Tendo a rendere le condizioni a linea singola come.

#define ZZ_Slash_for_commenting_out/
#ifdef _DEBUG 
#define D_B_O std::cerr 
#else 
#define D_B_O ZZ_Slash_for_commenting_out/ 
#endif 
    D_B_O << "Your thing here" << endl; 
+0

Che non funziona dallo standard ANSI C del 1989. – Potatoswatter

Problemi correlati