2012-05-08 20 views
55

Estoy tratando de averiguar cómo escribir una macro que pasará una representación literal de cadena de un nombre de variable junto con la variable misma en una función.¿Cómo utilizar el argumento de macro como cadena literal?

Por ejemplo, dada la siguiente función.

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

me gustaría escribir una macro para que pueda hacer esto:

int my_val = 5; 
CALL_DO_SOMETHING(my_val); 

cual sería imprimir: my_val: 5

He intentado hacer lo siguiente:

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

Sin embargo, como se puede adivinar, el VAR dentro de las comillas no se reemplaza, sino que simplemente se pasa como la cadena literal "VAR". Entonces me gustaría saber si hay una manera de hacer que el argumento macro se convierta en una cadena literal.

+0

Cómo estás tratando para usar esto? – chris

Respuesta

92

utilizar el preprocesador # operator:

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

que desea utilizar el operador 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

No estoy del todo seguro, pero parece que '" Hola "#x" '(y' #x "Hola" ') hace que la cuerda se pegue sin espacio, que es lo que se desea en algunos casos, por lo que esta es una respuesta bastante buena. – Smar

+0

@Smar Asegúrate de poner un espacio después de la cadena constante Hola: '" Hola "# x' – jack

+0

Bien, pensé que sí, deberías editar eso a tu respuesta también, ya que es una valiosa información :) – Smar

0

Tal vez intenta esta solución:

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