имя переменной g ++ unicode - PullRequest
       37

имя переменной g ++ unicode

7 голосов
/ 21 апреля 2010

Я пытаюсь использовать имена переменных Юникода в g ++.

Это не похоже на работу.

g ++ не поддерживает имена переменных в юникоде ... или есть какое-то подмножество юникода (из которого я не тестирую)

Спасибо!

Ответы [ 2 ]

9 голосов
/ 21 апреля 2010

Вы должны указать флаг -fextended-identifiers при компиляции, вы также должны использовать \ uXXXX или \ uXXXXXXXX для Unicode (по крайней мере в gcc это Unicode)

Идентификаторы (имена переменных / классов и т. Д.) В g ++ не могут иметь utf-8 / utf-16 или любой другой кодировки, они должны быть:

identifier:
  nondigit
  identifier nondigit
  identifier digit

нецифровое число

nondigit: one of
  universalcharactername
  _ a b c d e f g h i j k l m n o p q r s t u v w x y z
  A B C D E F G H I J K L M N O P Q R S T U V W X Y Z

и универсальноеЧаследующее имя

universalcharactername:
  \UXXXXXXXX
  \uXXXX

Таким образом, если вы сохраните свой исходный файл как UTF-8, у вас не будет такой переменной, как, например ::

int høyde = 10;

это должно было быть написано как:

int h\u00F8yde = 10;

(какой бы imo побил всю цель - так что просто придерживайтесь a-z)

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

Однострочный патч для препроцессора cpp позволяет вводить UTF-8. Детали для gcc даны на

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

однако, поскольку препроцессор является общим, этот же патч должен работать и для g ++. В частности, необходим патч для gcc-5.2

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;

Обратите внимание, что для работы вышеуказанного патча должна быть установлена ​​последняя версия iconv, которая поддерживает преобразования C99. Введите iconv --list, чтобы проверить это, в противном случае вы можете установить новую версию iconv вместе с gcc, как описано в ссылке выше. Измените команду настройки на

$ ../gcc-5.2.0/configure -v --disable-multilib \
    --with-libiconv-prefix=/usr/local/gcc-5.2 \
    --prefix=/usr/local/gcc-5.2 \
    --enable-languages="c,c++"

если вы собираете для x86 и хотите также включить компилятор c ++.

...