sintaxis programacion juegos funciones ejemplos definicion comandos codigos codigo basicos c++ c++11 c-preprocessor rawstring

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]:

[...]

  1. El archivo fuente se descompone en tokens de preprocesamiento (2.5) y secuencias de caracteres en espacios en blanco (incluidos los comentarios).

  2. 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é?