Можно ли заставить GCC скомпилировать UTF-8 с исходными файлами спецификации? - PullRequest
12 голосов
/ 26 октября 2011

Я разрабатываю кроссплатформенность на C ++ с использованием Microsoft Visual Studio для Windows и GCC на uBuntu Linux.

В Visual Studio я могу использовать символы Unicode, такие как " π " и " ² "в моем коде.Visual Studio всегда сохраняет исходные файлы как UTF-8 с BOM (Byte Order Mark).

Например:

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

GCC успешно компилирует эти файлы, только если я сначала удаляю BOM.Если я не удаляю спецификацию, я получаю следующие ошибки:

wwga_hydutils.cpp: 28: 9: ошибка: отклонение '\ 317' в программе

wwga_hydutils.cpp:28: 9: ошибка: отклонение '\ 200' в программе

Что приводит меня к вопросу:

Есть ли способ заставить GCC компилировать файлы UTF-8 без предварительногоудаление спецификации?


Я использую:

  • Windows 7
  • Visual Studio 2010

и:

  • uBuntu Oneiric 11.10
  • GCC 4.6.1 (в соответствии с apt-get install gcc )

Редактировать:

Как указал первый комментатор, моя проблема заключалась в не спецификации, но с использованием символов, отличных от ascii, вне строковых констант.GCC не нравится не-ascii символы в именах символов, но оказывается, что GCC полностью совместим с UTF-8 с спецификацией.

Ответы [ 2 ]

3 голосов
/ 15 августа 2015

Хотя в gcc поддерживаются юникод-идентификаторы, ввод UTF-8 - нет. Поэтому идентификаторы Unicode должны быть закодированы с использованием управляющих кодов \ uXXXX и \ UXXXXXXXX. Однако простой однострочный патч для препроцессора cpp позволяет gcc и g ++ обрабатывать ввод UTF-8 при условии, что также установлена ​​последняя версия iconv, которая поддерживает преобразования C99. Подробности присутствуют на

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

Однако патч настолько прост, что его можно получить прямо здесь.

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;

Даже с патчем необходимы две опции командной строки для включения ввода UTF-8. В частности, попробуйте что-то вроде

$ /usr/local/gcc-5.2/bin/gcc \
    -finput-charset=UTF-8 -fextended-identifiers \
    -o circle circle.c
3 голосов
/ 26 октября 2011

Согласно GCC Wiki , это пока не поддерживается.Вы можете использовать -fextended-identifiers и предварительно обработать ваш код для преобразования идентификаторов в UCN.Со связанной страницы:

perl -pe 'BEGIN { binmode STDIN, ":utf8"; } s/(.)/ord($1) < 128 ? $1 : sprintf("\\U%08x", ord($1))/ge;' 

См. Также g ++ имя переменной Unicode и Идентификаторы Unicode и исходный код на C ++ 11?

...