2012-05-08 4 views
55

Sto cercando di capire come scrivere una macro che passerà sia una rappresentazione letterale di stringa di un nome di variabile insieme alla variabile stessa in una funzione.Come utilizzare l'argomento Macro come stringa letterale?

Ad esempio, data la seguente funzione.

void do_something(string name, int val) 
{ 
    cout << name << ": " << val << endl; 
} 

vorrei scrivere una macro in modo che io possa fare questo:

int my_val = 5; 
CALL_DO_SOMETHING(my_val); 

Che sarebbe stampare: my_val: 5

ho provato a fare quanto segue:

#define CALL_DO_SOMETHING(VAR) do_something("VAR", VAR); 

Tuttavia, come puoi immaginare, il VAR all'interno delle virgolette non viene sostituito, ma viene semplicemente passato come stringa letterale "VAR". Quindi mi piacerebbe sapere se c'è un modo per avere l'argomento macro trasformato in una stringa letterale stessa.

+0

Come si sta cercando usare questo? – chris

risposta

92

Utilizzare il preprocessore # operator:

#define CALL_DO_SOMETHING(VAR) do_something(#VAR, VAR); 
22

si desidera utilizzare l'operatore stringizing:

#define STRING(s) #s 

int main() 
{ 
    const char * cstr = STRING(abc); //cstr == "abc" 
} 
5
#define NAME(x) printf("Hello " #x); 
main(){ 
    NAME(Ian) 
} 
//will print: Hello Ian 
+0

Non ne sono del tutto sicuro, ma sembra che "Hello" #x "' (e '#x" Hello "') fa sì che la stringa sia incollata insieme senza spazio, che è ciò che si desidera in alcuni casi, quindi – Smar

+0

@Smar Assicurati di mettere uno spazio dopo la stringa costante Ciao: '" Ciao "# x' – jack

+0

Okay, pensavo di sì, dovresti modificarlo anche per la tua risposta dato che è una preziosa informazione :) – Smar

0

Forse si tenta questa soluzione:

#define QUANTIDISCHI 6 
#define QUDI(x) #x 
#define QUdi(x) QUDI(x) 
. . . 
. . . 
unsigned char TheNumber[] = "QUANTIDISCHI = " QUdi(QUANTIDISCHI) "\n";