2013-01-16 11 views
25

Per esempio io ho una macro:Che cosa significa #x all'interno di una macro C?

#define PRINT(int) printf(#int "%d\n",int) 

I kinda so che cosa è il risultato. Ma come mai #int rappresenta il tutto?

Mi dimentico di questo dettaglio. Qualcuno può gentilmente darmi un suggerimento?

Grazie!

+0

Possibile duplicato di questo http://stackoverflow.com/questions/10676999/stringizing-operator – Omkant

risposta

29

In questo contesto (applicato a un riferimento di parametro in una definizione di macro), il segno di cancelletto indica di espandere questo parametro nel testo letterale dell'argomento passato alla macro.

In questo caso, se si chiama PRINT(5) l'espansione della macro sarà printf("5" "%d\n", 5); che stamperà 5 5; non molto utile; tuttavia se chiami PRINT(5+5) l'espansione della macro sarà printf("5+5" "%d\n", 5+5); che stamperà 5+5 10, un po 'meno banale.

Questo stesso esempio è spiegato in this tutorial on the C preprocessor (che, per inciso, è il primo hit di Google per c macro pound sign).

+0

questa funzione gcc o ANSi C standard? –

+2

@AndersLind: questo è un comportamento standard. Vedi §6.10.3.2/2 che descrive in dettaglio la semantica dell'operatore '#'. – dreamlax

+0

@dreamlax wow, grazie. Non lo uso mai nella mia vita di programmazione di 10 anni ... dannazione! .. Però programma C++ per la maggior parte del tempo –

4

Questa è una cattiva scelta del nome per il parametro macro, ma innocua (grazie a dreamlax).

Fondamentalmente se scrivo questo modo

PRINT(5); 

Sarà sostituito come

printf("5" "%d\n",5); 

o

printf("5 %d\n",5); 

È un processo chiamato Stringification, #int viene sostituito con un stringa che consiste del suo contenuto, 5 -> "5"

+1

La macro viene espansa dai preprocessi sor che non ha conoscenza del sistema di tipo C. Per quanto ne so, 'int' non infrange alcuna regola in §6.10 (Preprocessing directives), ma sono d'accordo che sia una cattiva scelta. – dreamlax

+0

Il tuo link alla documentazione di Stringification è morto, si prega di aggiornare. – DeathByTensors

+1

@DrewBuckley risolto! –

9

"#" può mostrare il nome di una variabile, è meglio definire la macro come questa:

#define PRINT(i) printf(#i "= %d\n", i) 

e usarlo in questo modo:

int i = 5; 
PRINT(i); 

risultato mostrato:

i = 5