2010-08-20 13 views
13

Sto leggendo il codice sorgente del telefono. È un'implementazione JavaME di FOSS. E 'scritto in C++, e ho inciampato su questo:Che cosa fa "#define STR (a) #a"?

// Makes a string of the argument (which is not macro-expanded) 
#define STR(a) #a 

So C e C++, ma non ho mai letto qualcosa di simile. Che cosa fa lo # in #a?

Inoltre, nello stesso file, c'è:

// Makes a string of the macro expansion of a 
#define XSTR(a) STR(a) 

Voglio dire, che cosa è l'uso di definire una nuova macro, se tutto ciò che fa è chiamare una macro esistente?

Il codice sorgente è https://phoneme.dev.java.net/source/browse/phoneme/releases/phoneme_feature-mr2-rel-b23/cldc/src/vm/share/utilities/GlobalDefinitions.hpp?rev=5525&view=markup. Puoi trovarlo con un CTRL + F.

+0

Apparentemente questo (in particolare la combinazione delle macro 'STR' e' XSTR') è chiamato "double stringize trick". C'è una spiegazione molto buona nella domanda [Come, esattamente, funziona il trucco a doppia stringa?] (http://stackoverflow.com/questions/2751870/how-exact-does-the-double-stringize-trick-work) – sleske

risposta

19

Nella prima definizione, #a significa per stampare l'argomento macro come una stringa. Questo si trasformerà, ad es. STR(foo) in "foo", ma non farà macroespansione sui suoi argomenti.

La seconda definizione non aggiunge nulla al primo, ma passando il suo argomento a un'altra macro, forza la piena espansione macro del suo argomento. Quindi XSTR(expr) crea una stringa di expr con tutte le macro completamente espanse.

+0

+1, mi piace dopo aver letto i sever –

5

# è l'operatore di stringa. Il preprocessore crea una stringa fuori dal parametro.

Diciamo che avete:

STR(MyClass); 

sarebbe pre-elaborato come:

"MyClass"; 

Il livello di riferimento indiretto (tramite XSTR()) ha a che fare con le regole di espansione di macro.

4

#a è denominato stringizer operator. Prende il parametro formale, in questo caso a, e lo trasforma in una stringa racchiudendolo tra virgolette.

Quindi, se si dispone di:

string s = STR("my quoted string"); 
cout << s; 

Il risultato sarebbe:

"my quoted string" 
+5

Non è importante, ma penso che "stringizer" sia solo Microsoft; è normalmente l'operatore "stringify" e il processo è chiamato "stringification" –

+0

Thx per la correzione. :) –

+2

Se hai intenzione di inventare parole, quindi "stringify" e "stringise" sono cromogene come le altre. Propongo "stringulate". –

4

In primo luogo, dovresti sapere che questa coppia di macro è in realtà abbastanza comune. Il primo fa esattamente quello che dice il commento: trasforma un argomento in una stringa racchiudendolo tra virgolette.

Il secondo è utilizzato per causare l'espansione macro dell'argomento. In genere usarli insieme qualcosa di simile:

#define a value_a 

printf("%s", XSTR(a)); 

La macro di espansione si espanderà a fuori a string_a, e la stringa i gireranno che in una stringa, quindi l'uscita sarà value_a.