2011-10-14 11 views
6

Estoy tratando de imprimir en la consola usando una macro el nombre de la variable para mostrar el valor de los miembros durante la depuración (registro). ¿Cómo hacer eso? Intenté lo siguiente pero no funcionó.imprime el nombre de la variable en un #define

#define MY_PRINT(x) std::cout << "'x'=" << x << std::endl; 

int main(){ 
    int my_variable=3; 
    MY_PRINT(my_variable); 
    // I would like to print to console 
    // 'my_variable'=3 
} 
+2

Defina "no funciona". He tenido que decírtelo muchas veces en el pasado, lo cual es una pena. –

+0

Hola Tomalek, por favor mira la respuesta a continuación. Es suficiente agregar el carácter '#' –

+2

Sí, sé cuál es la respuesta yo también. Pero estoy tratando de entrenarte, un poco tarde, para escribir las preguntas correctas. –

Respuesta

17

Auch ... He encontrado la solución.

que debería escribir la macro como esta

#define MY_PRINT(x) std::cout << #x"=" << x << std::endl 
2

para C++ utilizo este:

#define STR(x) #x << '=' << x 

int main() 
{ 
    int i = 1; 
    std::string str("hello"); 
    std::vector<std::string> vec; 
    my_class mc; 

    ... 

    std::cout << STR(i) << std::endl 
      << STR(str) << std::endl 
      << STR(vec) << std::endl 
      << STR(mc) << std::endl; 

    return 0; 
} 

De esta manera el compilador elige el operador de streaming basado en el tipo de datos, por lo que no lo hace necesita molestarse con diferentes macros para cada uno, y puede ir a cualquier std :: ostream, no solo a std :: cout. Simplemente proporcione el operador de transmisión en función de los datos:

std::ostream operator<<(std::ostream&, const T&); 
std::ostream operator<<(std::ostream&, const std::vector<T>&); 
etc 

Pero me gustaría que hubiera una manera de plantilla para reemplazar la macro, o al menos el nombre de la variable proporcionada por el #x.

Cuestiones relacionadas