¿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.
De acuerdo con el Wiki de GCC , esto aún no es compatible. Puede usar -fextended-identifiers
y preprocesar su código para convertir los identificadores a UCN. Desde la página enlazada:
perl -pe ''BEGIN { binmode STDIN, ":utf8"; } s/(.)/ord($1) < 128 ? $1 : sprintf("//U%08x", ord($1))/ge;''
Consulte también el nombre de la variable unicode g ++ y los identificadores Unicode y el código fuente en C ++ 11?
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