Estoy trabajando en un proyecto en el que tengo muchas cadenas constantes formadas por concatenación (números, etc.).¿Cómo convertir cadenas concatenadas a wide-char con el preprocesador C?
Por ejemplo, tengo una macro LOCATION
que formatea __FILE__
y __LINE__
en una cadena que permita saber dónde estoy en el código, al imprimir mensajes o errores:
#define _STR(x) # x
#define STR(x) _STR(x)
#define LOCATION __FILE__ "(" STR(__LINE__) ")"
es así, esto formatee una ubicación como "file.cpp (42)". El problema es cuando intento convertir el resultado a una amplia cadena:
#define _WIDEN(x) L ## x
#define WIDEN(x) _WIDEN(x)
#define WLOCATION WIDEN(LOCATION)
Esto funciona muy bien con GCC, y los resultados en L "file.cpp (42)" ser insertado en mi código. Sin embargo, cuando se trata esto con MSVC++ (utilizando Visual C++ 2008 Express), me sale un error:
error: Concatenating wide "file.cpp" with narrow "("
entiendo que el L
prefijo se agrega sólo para el primer término de mi expresión. También he intentado esto:
#define _WIDEN(x) L ## #x
¿Qué "obras", sino que da la cadena L"\"file.cpp\" \"(\" \"42\" \")\""
que obviamente no es muy conveniente (y no lo que busco), sobre todo teniendo en cuenta que esta macro es simple en comparación con otra macros.
Entonces, mi pregunta es: ¿cómo puedo hacer que se aplique a la expresión completa en MSVC++, para que pueda obtener el mismo resultado que obtengo con GCC? Preferiría no crear una segunda cadena con tokens de ancho total, porque tendría que mantener dos macros para cada uno, lo que no es muy conveniente y puede provocar errores. Además, también necesito la versión angosta de cada cadena, por lo que el uso de cadenas de todo el ancho tampoco es una opción, desafortunadamente.
Eso funciona, aunque es una sintaxis incómoda y tiene muchos gastos ... pero funciona y no tengo que mantener varias macros. Con suerte, Microsoft actualizará su preprocesador para admitir más características C99, las cosas serían mucho más simples de esta manera. Gracias! –