¿Cómo usar el argumento macro como literal de cadena?


91

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 en sí a una función.

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 poder hacer esto:

int my_val = 5;
CALL_DO_SOMETHING(my_val);

Que imprimiría: my_val: 5

Intenté hacer lo siguiente:

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

Sin embargo, como 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 convertir el argumento macro en una cadena literal.


¿Cómo intentas usar esto?
chris

Respuestas:


145

Utilice el #operador del preprocesador :

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

28

Quiere utilizar el operador de encadenamiento:

#define STRING(s) #s

int main()
{
    const char * cstr = STRING(abc); //cstr == "abc"
}

9

Quizás intente esta solución:

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

¿Cómo responde esto a la pregunta o cómo es útil?
jirigracik

1
@jirigracik - Permite obtener presentación de cadena de la expansión de macros, así, a diferencia de otras respuestas
grepcake

3
Creo que sería útil explicar por qué tener simplemente QUDI(x)no es suficiente.
LRDPRDX

8
#define NAME(x) printf("Hello " #x);
main(){
    NAME(Ian)
}
//will print: Hello Ian

No estoy totalmente seguro, pero parece que "Hello" #x"(y #x "Hello") hace que la cadena se pegue sin espacio, que es lo que se desea en algunos casos, por lo que esta es una respuesta bastante buena.
Smar

1
@Smar Asegúrese de poner un espacio después de la cadena constante Hola: "Hello " #x
jack

Está bien, eso pensé, deberías editar eso en tu respuesta también, ya que es una información valiosa :)
Smar
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.