gcc utf-8 g++ byte-order-mark

¿Es posible hacer que GCC compile UTF-8 con archivos fuente BOM?



g++ byte-order-mark (2)

Desarrollo una plataforma multiplataforma C ++ utilizando Microsoft Visual Studio en Windows y GCC en uBuntu Linux.

En Visual Studio puedo usar símbolos unicode como " π " y " ² " en mi código. Visual Studio siempre guarda los archivos de origen como UTF-8 con BOM (Marca de orden de bytes).

Por ejemplo:

// A = π.r² double π = 3.14;

GCC felizmente compila estos archivos solo si elimino la lista de materiales primero. Si no elimino la lista de materiales, recibo errores como estos:

wwga_hydutils.cpp: 28: 9: error: perdida ''/ 317'' en el programa

wwga_hydutils.cpp: 28: 9: error: extraviar ''/ 200'' en el programa

Lo que me lleva a la pregunta:

¿Hay alguna manera de que GCC compile archivos UTF-8 sin eliminar primero la lista de materiales?

Estoy usando:

  • Windows 7
  • Visual Studio 2010

y:

  • uBuntu Oneiric 11.10
  • GCC 4.6.1 (provisto por apt-get install gcc )

Editar:

Como señaló el primer comentarista, mi problema no era el BOM, sino tener caracteres no ascii fuera de las constantes de cadena. A GCC no le gustan los caracteres no ascii en los nombres de los símbolos, pero resulta que GCC es totalmente compatible con UTF-8 con BOM.



Si bien los identificadores unicode son compatibles con gcc, la entrada UTF-8 no lo es. Por lo tanto, los identificadores Unicode deben codificarse utilizando los códigos de escape / uXXXX y / UXXXXXXXX. Sin embargo, un simple parche de una línea para el preprocesador cpp permite a gcc y g ++ procesar la entrada UTF-8 siempre que también esté instalada una versión reciente de iconv que admita conversiones C99. Los detalles están presentes en

https://www.raspberrypi.org/forums/viewtopic.php?p=802657

Sin embargo, el parche es tan simple que se puede dar aquí.

diff -cNr gcc-5.2.0/libcpp/charset.c gcc-5.2.0-ejo/libcpp/charset.c *** gcc-5.2.0/libcpp/charset.c Mon Jan 5 04:33:28 2015 --- gcc-5.2.0-ejo/libcpp/charset.c Wed Aug 12 14:34:23 2015 *************** *** 1711,1717 **** struct _cpp_strbuf to; unsigned char *buffer; ! input_cset = init_iconv_desc (pfile, SOURCE_CHARSET, input_charset); if (input_cset.func == convert_no_conversion) { to.text = input; --- 1711,1717 ---- struct _cpp_strbuf to; unsigned char *buffer; ! input_cset = init_iconv_desc (pfile, "C99", input_charset); if (input_cset.func == convert_no_conversion) { to.text = input;

Incluso con el parche, se necesitan dos opciones de línea de comando para habilitar la entrada UTF-8. En particular, pruebe algo como

$ /usr/local/gcc-5.2/bin/gcc / -finput-charset=UTF-8 -fextended-identifiers / -o circle circle.c