Pregunta

He creado un nuevo proyecto con el siguiente segmento de código:

char* strange = "(Strange??)";
cout << strange << endl;

resultante en la salida siguiente:

  

(Strange]

Así traducir '??)' -> ']'

Depuración muestra que mi char * cadena literal es en realidad ese valor y que no es una traducción corriente. Esto obviamente no es una secuencia de meta-caracteres que he visto nunca. Una especie de Unicode o secuencia de carbón amplia, tal vez? Yo no lo creo sin embargo ... He intentado desactivar todos los ajustes relacionados con el proyecto en vano.

Alguien tiene una explicación?

  • Búsqueda: 'signo de interrogación, signo de interrogación, llave de cierre' c c ++ cadena literal
¿Fue útil?

Solución

Lo que están viendo que se llama un trigraph .

En el lenguaje escrito por los adultos, un signo de interrogación es suficiente para cualquier situación. No utilice más de una a la vez y que nunca verá esto otra vez.

CCG ignora trigrafos por defecto porque casi nadie los usa intencionadamente. Permitirles con la opción -trigraph, o decirle al compilador para que le advierte acerca de ellos con la opción -Wtrigraphs.

Visual C ++ 2010 también deshabilita por defecto y ofrece /Zc:trigraphs para habilitarlos. No puedo encontrar nada sobre la manera de activar o desactivar en las versiones anteriores.

Otros consejos

Una forma sencilla de evitar la trigraph sorpresa: dividir una "??" cadena literal en dos:

char* strange = "(Strange??)";
char* strange2 = "(Strange?" "?)";
/*                         ^^^ no punctuation */

Editar
gcc tiene una opción para advertir sobre trigrafos: -Wtrigraphs (activado con -Wall también)
extremo editar

Las citas de la Norma

    5.2.1.1 Trigraph sequences
1   Before any other processing takes place, each occurrence of one of the
    following sequences of three characters (called trigraph sequences13))
    is replaced with the corresponding single character.
           ??=      #               ??)      ]               ??!      |
           ??(      [               ??'      ^               ??>      }
           ??/      \               ??<      {               ??-      ~
    No other trigraph sequences exist. Each ? that does not begin one of
    the trigraphs listed above is not changed.
    5.1.1.2 Translation phases
1   The precedence among the syntax rules of translation is specified by
    the following phases.
         1.   Physical source file multibyte characters are mapped, in an
              implementation-defined manner, to the source character set
              (introducing new-line characters for end-of-line indicators)
              if necessary. Trigraph sequences are replaced by corresponding
              single-character internal representations.

Es un Trigraph !

??) es un trigraph .

Eso es trigraph apoyo. Puede evitar la interpretación trigraph escapando cualquiera de los caracteres:

char* strange = "(Strange?\?)";

Es un trigraph .

tri-grafos son la razón. El hablar de C en el artículo también se aplica a C ++

Como se ha mencionado varias veces, que está siendo mordido por una trigraph. Ver esta pregunta anterior SO para obtener más información:

Puede solucionar el problema utilizando el '\?' secuencia de escape para el '?' personaje:

char* strange = "(Strange\?\?)";

De hecho, esta es la razón de que la secuencia de escape, que es algo misterioso si está al tanto de esos malditos trigrafos.

Mientras trata de una compilación cruzada en GCC es elegido mi secuencia como un trigraph :

Así que todo lo que hay que hacer ahora es averiguar cómo desactivar esto en proyectos por defecto, ya que sólo se puede ver la creación de problemas para mí. (Estoy usando un diseño de teclado de Estados Unidos de todos modos)

El comportamiento predeterminado de GCC es ignorar sino dar una advertencia, que es mucho más sano y es precisamente lo que Visual Studio 2010 adoptará como el estándar por lo que yo sé.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top