2011-10-26 42 views
11

Desarrollo C++ multiplataforma usando Microsoft Visual Studio en Windows y GCC en uBuntu Linux.¿Es posible hacer que GCC compile UTF-8 con archivos fuente BOM?

En Visual Studio I pueden 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 compila felizmente estos archivos sólo si se quita la lista de materiales en primer lugar. Si no quito la lista de materiales, recibo errores como estos:

wwga_hydutils.cpp:28:9: error: stray ‘\317’ in program

wwga_hydutils.cpp:28:9: error: stray ‘\200’ in program

que me lleva a la pregunta:

¿Hay una manera de conseguir GCC para compilar archivos UTF-8 sin quitar primero la lista de materiales ?


que estoy usando:

  • Windows 7
  • Visual Studio 2010

y:

  • Ubuntu 11.10 onírico
  • GCC 4.6.1 (según lo dispuesto por apt-get install gcc)

Editar:

Como la primera comentarista señaló, mi problema era no la lista de materiales, pero teniendo 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.

+2

Funciona bien para mí en gcc 4.4.5, usando una cadena que contiene los dos caracteres UNICODE en su pregunta. Archivo con BOM. Además, el error que recibe no tiene nada que ver con la lista de materiales, pero parece ser que los caracteres UNICODE en cuestión están fuera de cualquier cadena (por eso se llaman _stray_.) –

+0

@JoachimPileborg sí, los caracteres Unicode están fuera de la cadena, el "π" que estaba usando como nombre de símbolo, el "²" solo estaba en los comentarios. Cuando elimino la lista de materiales, elimina el error de la salida de la consola, pero supongo que no es garantía de que GCC esté realmente manejando a los personajes como espero. – Boinst

+0

@JoachimPileborg, actualicé la pregunta para incluir el contexto en el que estoy usando los caracteres Unicode. – Boinst

Respuesta

3

Mientras identificadores Unicode son compatibles con gcc, UTF-8 de entrada no es. Por lo tanto, los identificadores Unicode deben codificarse utilizando los códigos de escape \ uXXXX y \ UXXXXXXXX. Sin embargo, un parche simple 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 
Cuestiones relacionadas