Es bastante común utilizar la concatenación de macros y tokens para alternar entre cadenas anchas y angostas en tiempo de compilación.¿Se revierten las sustituciones de trigrafos cuando se crea una cadena sin formato mediante concatenación?
#define _T(x) L##x
const wchar_t *wide1 = _T("hello");
const wchar_t *wide2 = L"hello";
Y en C++ 11 debería ser válido para confeccionar una cosa similar con cadenas primas:
#define RAW(x) R##x
const char *raw1 = RAW("(Hello)");
const char *raw2 = R"(Hello)";
Desde expansión de la macro y la concatenación de contadores ocurre antes de la sustitución de secuencia de escape, esto debería evitar secuencias de escape siendo reemplazado en la cadena citada.
Pero, ¿cómo se aplica esto a los trigrafos? ¿Las cadenas sin formato formadas mediante concatenación con cadenas normales aún están sujetas a que se reviertan sus sustituciones de trigrafos?
const char *trigraph = RAW("(??=)"); // Is this "#" or "??="?
¿Cuánto tiempo lleva probar esto en un compilador, frente al tiempo dedicado a hacer la pregunta aquí? –
No estoy buscando usarlo en el código de producción, estoy escribiendo un compilador y parece un caso extremo. Además, no conozco ningún compilador con soporte completo de C++ 0x (y no creo que el estándar final haya sido publicado aún). –
@Damien esa no es una respuesta adecuada ... Los compiladores para C++ saben divergir de la especificación –