este problema se puede solucionar de diferentes formas, por lo tanto te damos la que en nuestra opinión es la solución más completa.
Solución:
Puedes usar el preprocesador “stringify” #
para hacer lo que quieras:
#include
#define PRINTER(name) printer(#name, (name))
void printer(char *name, int value)
printf("name: %stvalue: %dn", name, value);
int main (int argc, char* argv[])
int foo = 0;
int bar = 1;
PRINTER(foo);
PRINTER(bar);
return 0;
name: foo value: 0
name: bar value: 1
(Lo siento por printf
nunca le cogí el truco
. Pero esto debería ser suficiente.)
prueba esto:
#define GET_VARIABLE_NAME(Variable) (#Variable)
//en funciones
int var=0;
char* var_name= GET_VARIABLE_NAME(var);
Yo tuve el mismo problema. Después de un poco de experimentación, creé las siguientes macros que convierten nombres de variables, campos, funciones, métodos y tipos en cadenas.
#define MACRO_VARIABLE_TO_STRING(Variable) (void(Variable),#Variable)
#define MACRO_FUNCTION_TO_STRING(Function) (void(&Function),#Function)
#define MACRO_METHOD_TO_STRING(ClassName,Method) (void(&ClassName::Method),#Method)
#define MACRO_TYPE_TO_STRING(Type) (void(sizeof(Type)),#Type)
El código usa el operador de coma y void conversión para obligar al compilador a verificar si la variable, función, etc. realmente existe. Lo bueno es que también funciona bien con variables no inicializadas. Lo probé tanto en VC como en GCC con todas las opciones pedantes que descubrí sin ningún mensaje de advertencia.
int GetAndPrintValue(const char* VariableName)
std::cout << VariableName << std::endl;
return 10;
int Variable=GetAndPrintValue(MACRO_VARIABLE_TO_STRING(Variable));
Utilizo dicho código cuando escribo analizadores que leen datos del flujo de entrada y si la variable analizada está fuera de los límites, arroja una excepción con el nombre de la variable que falló en mis comprobaciones de validez.
Si posees alguna incertidumbre o forma de ascender nuestro ensayo puedes añadir una glosa y con gusto lo leeremos.