g++;unicode变量名

g++;unicode变量名,unicode,variables,g++,Unicode,Variables,G++,我试图在g++中使用unicode变量名 它似乎不起作用 g++不支持unicode变量名。。。或者是否存在unicode的某个子集(我不打算从中进行测试) 谢谢 编译时必须指定-fextended identifiers标志,还必须使用\uxxx或\uxxxxx表示unicode(至少在gcc中是unicode) g++中的标识符(变量/类名等)不能是utf-8/utf-16或任何编码, 它们必须是: identifier: nondigit identifier nondigit

我试图在g++中使用unicode变量名

它似乎不起作用

g++不支持unicode变量名。。。或者是否存在unicode的某个子集(我不打算从中进行测试)


谢谢

编译时必须指定
-fextended identifiers
标志,还必须使用\uxxx或\uxxxxx表示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即可)

cpp预处理器的单线补丁允许UTF-8输入。有关gcc的详细信息,请参阅

但是,由于预处理器是共享的,因此相同的补丁也适用于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;
请注意,要使上述修补程序正常工作,需要安装支持C99转换的最新版本的iconv。键入iconv--list以验证这一点,否则,您可以按照上面的链接中所述安装新版本的iconv和gcc。将configure命令更改为

$ ../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++编译器。

在CLAG中有更好的支持吗?G++不是符合标准的(但是其他编译器,包括COMMO)都不符合标准。对于标准C++,在第一个翻译阶段,“不在基本源字符集(2.3)中的任何源文件字符被指定字符的通用字符名替换,并且LeXER规则对其结果进行操作。在C++11标准中,这是在“翻译阶段”§2.2/1第一个列表项中指定的。@anon Yes,clang允许在标识符中使用重音字符。@anon Yes,从clang 3.3开始,在UTF-8中支持unicode标识符。9年后,G++9.1仍然对UTF-8符号视而不见,即使使用
-fextended标识符-finput charset=UTF-8
。(作为参考,MSVC++也可以使用-utf-8或源代码中的BOM)另请参见:·g++不是符合标准的wrt。标识符中的字符。但我不知道有哪种编译器符合标准。我的印象是,大多数编译器将标识符字符限制为英文A…Z和下划线,加上$符号,这在两个方面是错误的:不允许标准附录E中指定的大量Unicode字符(我在中列出了它们),以及允许标准不允许的$。简言之,标准和现行做法非常不一致。也许使用C++11…;-)干杯,干杯,-阿尔夫·特里克:)