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.
Respuestas:
Utilice el
#
operador del preprocesador :#define CALL_DO_SOMETHING(VAR) do_something(#VAR, VAR);
fuente
Quiere utilizar el operador de encadenamiento:
#define STRING(s) #s int main() { const char * cstr = STRING(abc); //cstr == "abc" }
fuente
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";
fuente
QUDI(x)
no es suficiente.#define NAME(x) printf("Hello " #x); main(){ NAME(Ian) } //will print: Hello Ian
fuente
"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."Hello " #x