ejemplos - ¿C++ concatenando las macros__FILE__ y__LINE__?
c++ online (1)
Necesitas expandir esa macro en dos niveles:
#define S1(x) #x
#define S2(x) S1(x)
#define LOCATION __FILE__ " : " S2(__LINE__)
¿Por qué?
Respuesta corta: necesita expandir __LINE__
en dos niveles, antes de pasarlo a #x
.
Respuesta larga: en primer lugar, al utilizar el operador #
en una macro similar a una función , debe ir seguido de un parámetro de macro, pero __LINE__
no es un parámetro, por lo que el compilador se queja de que es un operador parásito.
Segundo, __LINE__
sí mismo es una macro y contiene el número de línea actual, debe expandirse al número antes de usarlo con #
, de lo contrario, obtendrá la cadena "__LINE__"
lugar de un número.
La macro S2(__LINE__)
expande __LINE__
a un número de línea, luego pasamos el número de línea a #x
.
Quiero que mis mensajes de excepción contengan información sobre la ubicación de la excepción.
Así que me gustaría tener algo parecido a esto.
#define LOCATION __FILE__ " : " __LINE__
throw std::exception(std::string("ABCD. ") + LOCATION);
Esa definición es obviamente incorrecta. ¿Cómo lograr esto?