馃槂 (y otros caracteres Unicode) en identificadores no permitidos por g++

4 minutos de lectura

😃 (y otros caracteres Unicode) en identificadores no permitidos por g++
jose mansfield

soy 😞 para encontrar que no puedo usar 😃 como un identificador válido con g ++ 4.7, incluso con el -fextended-identifiers opción habilitada:

int main(int argc, const char* argv[])
{
  const char* 😃 = "I'm very happy";
  return 0;
}

main.cpp:3:3: error: perdido ‘\360’ en el programa
main.cpp:3:3: error: perdido ‘\237’ en el programa
main.cpp:3:3: error: extraviado ‘\230’ en el programa
main.cpp:3:3: error: extraviado ‘\203’ en el programa

Después de googlear un poco, descubrí que Los caracteres UTF-8 aún no se admiten en los identificadorespero un nombre-de-personaje-universal Deberia trabajar. Así que convierto mi fuente a:

int main(int argc, const char* argv[])
{
  const char* \U0001F603 = "I'm very happy";
  return 0;
}

main.cpp:3:15: error: el carácter universal \U0001F603 no es válido en un identificador

Así que aparentemente 😃 no es un carácter identificador válido. Sin embargo, el estándar permite específicamente caracteres del rango 10000-1FFFD en el Anexo E.1 y no lo desautoriza como carácter inicial en E.2.

Mi siguiente esfuerzo fue ver si funcionaba cualquier otro carácter Unicode permitido, pero ninguno de los que probé funcionó. Ni siquiera lo siempre importante PILA DE CACA (💩) personaje.

Entonces, en aras de nombres de variables significativos y descriptivos, ¿qué da? Lo hace -fextended-identifiers hacer lo que anuncia o no? ¿Solo es compatible con la última versión? ¿Y qué tipo de soporte tienen otros compiladores?

  • Solo curiosidad: qué cosas horribles te hicieron las personas que tendrán que mantener tu código para merecer identificadores como \U0001F603?

    – Felipe

    2 oct 2012 a las 15:18

  • Lo llaman C/C++ – está justificado.

    –Joseph Mansfield

    2 oct 2012 a las 15:23


  • “en aras de nombres de variables significativos y descriptivos” – ¿ROFLMAO? Lo siento, quise decir 😸.

    – deceze

    2 oct 2012 a las 15:28

  • La pregunta es: “Entonces, por el bien de los nombres de variables significativos y descriptivos, ¿qué pasa?” — La respuesta es: “Deja de perder el tiempo y vuelve al trabajo”. 🙂

    – ben

    2 oct 2012 a las 15:43


  • Vaya, creo que 💩 es el nombre más apropiado para una clase con la que había estado trabajando.

    usuario3995702

    9 jun 2016 a las 16:37

😃 (y otros caracteres Unicode) en identificadores no permitidos por g++
kennytm

A partir de 4.8, gcc no admite caracteres fuera del BMP utilizados como identificadores. Parece ser una restricción innecesaria. Además, gcc solo admite un conjunto de caracteres muy restringido descrito en ucnid.tabbasado en C99 y C++98 (Parece que todavía no está actualizado a C11 y C++ 11).

Como se describe en el manual, -fextended-identifiers es experimentalpor lo que tiene una mayor probabilidad de que no funcione como se esperaba.


Editar:

GCC admitió el conjunto de caracteres C11 a partir de 4.9.0 (r204886 para ser preciso). Entonces, la segunda pieza de código de OP usando \U0001F603 funciona. Todavía no puedo obtener el código real usando 😃 para trabajar incluso con -finput-charset=UTF-8 con GCC 8.2 en https://gcc.godbolt.org aunque (es posible que desee seguir este informe de erroresproporcionada por @DanielWolf).

Mientras tanto, ambas piezas de código funcionan en clang 3.3 sin más opciones que -std=c++11.

  • Qué tal si main.cpp:3:15: error: universal character \u00a8 is not valid in an identifier? Sin embargo, esto es con 4.7.

    –Joseph Mansfield

    2 oct 2012 a las 15:29

😃 (y otros caracteres Unicode) en identificadores no permitidos por g++
daniel lobo

esto fue un error conocido en GCC 9 y antes. Esta ha sido arreglado en CCG 10.

los registro de cambios oficial para GCC 10 contiene esta sección:

Los caracteres extendidos en los identificadores ahora se pueden especificar directamente en la codificación de entrada (UTF-8, por defecto), además de la sintaxis UCN (\uNNNN o \UNNNNNNNN) que ya es compatible:

static const int π = 3;
int get_naïve_pi() {
  return π;
}

Sin embargo, el estándar permite específicamente caracteres del rango 10000-1FFFD en el Anexo E.1 y no los rechaza como carácter inicial en E.2.

Una cosa a tener en cuenta es que el hecho de que el estándar C++ permita (o no permita) alguna característica no significa necesariamente que su compilador admita (o no admita) esa característica.

  • Sí, permitir el conjunto completo de caracteres Unicode especificado por el estándar es uno que, hasta donde yo sé, ningún compilador admite todavía, ya sea literalmente o con UCN.

    – bames53

    2 oct 2012 a las 15:42

  • ¡Por supuesto! Solo quise encontrar alguna documentación o fuente que muestre que no son compatibles con esta función.

    –Joseph Mansfield

    2 oct 2012 a las 15:47

  • @sftrabbit Bien, tal vez mi respuesta sea señalar lo obvio. KennyTM dio el enlace re: gcc.

    – Aprendiz de código

    2 oct 2012 a las 15:49

¿Ha sido útil esta solución?