programacion - En C++ 11, ¿qué debería pasar primero: expansión de cadenas sin formato o macros?
programacion c++ pdf (1)
GCC y clang tienen razón, VC ++ está equivocado.
2.2 Fases de la traducción [lex.phases]:
[...]
El archivo fuente se descompone en tokens de preprocesamiento (2.5) y secuencias de caracteres en espacios en blanco (incluidos los comentarios).
Las directivas de preprocesamiento se ejecutan, [...]
Y 2.5 tokens de preprocesamiento [lex.pptoken] enumeran string-literals
entre los tokens.
En consecuencia, se requiere un análisis para convertir primero el literal de la cadena, "consumiendo" la definición de función dostuff
y dostuff
.
Este código funciona en Visual C ++ 2013 pero no en gcc / clang:
#if 0
R"foo(
#else
int dostuff () { return 23; }
// )foo";
#endif
dostuff();
Visual C ++ elimina primero el if 0. Clang expande primero la cadena R raw (y nunca define dostuff). ¿Quién tiene razón y por qué?