【问题标题】:g++ unicode variable nameg++ unicode 变量名
【发布时间】:2011-02-10 12:37:56
【问题描述】:

我正在尝试在 g++ 中使用 unicode 变量名。

它似乎不起作用。

g++ 是否不支持 unicode 变量名,...或者是否存在 unicode 的某个子集(我没有在其中进行测试)。

谢谢!

【问题讨论】:

  • ¤ g++ 不符合标准。标识符中的字符。但我不知道有任何符合 的编译器。我的印象是,大多数编译器将标识符字符限制为英文 A...Z 和下划线,加上 $ 符号,这在两个方面是错误的:不允许标准附件 E 中指定的大量 Unicode 字符(I'我在pastie.org/3110152) 列出了它们,并允许 $,这是标准不允许的。简而言之,标准和现有做法大相径庭。也许使用 C++11... ;-) 干杯&hth.,
  • @Cheersandhth.-Alf 试试铿锵声:)

标签: unicode variables g++


【解决方案1】:

你必须在编译时指定-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)

【讨论】:

  • clang有更好的支持吗?
  • g++ 在这里不符合标准(但其他编译器也不符合标准,包括 Comeau)。对于标准 C++,在翻译的第一阶段“任何不在基本源字符集 (2.3) 中的源文件字符都将替换为指定该字符的通用字符名”,词法分析器规则对结果进行操作那。在 C++11 标准中,这在“翻译阶段”§2.2/1 第一个列表项中指定。
  • @anon 是的,clang 允许在标识符中使用重音字符。
  • @anon yes,从 clang 3.3 开始 there is 支持 UTF-8 中的 unicode 标识符。
  • 9 年后,G++ 9.1仍然对 UTF-8 符号视而不见,即使使用 -fextended-identifiers -finput-charset=UTF-8。 (作为参考,MSVC++ 也可以使用 -utf-8 或源代码中的 BOM。)另请参阅:stackoverflow.com/a/12693346/1479945
【解决方案2】:

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;

请注意,要使上述补丁生效,需要安装支持 C99 转换的最新版本的 iconv。输入 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++ 编译器。

【讨论】:

    猜你喜欢
    • 2010-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-12
    • 2019-04-20
    相关资源
    最近更新 更多