g ++ unicode变量名

ano*_*non 8 variables unicode g++

我想在g ++中使用unicode变量名.

它似乎不起作用.

g ++不支持unicode变量名,...还是有一些unicode子集(我从中没有测试过).

谢谢!

nos*_*nos 9

你必须-fextended-identifiers在编译时指定标志,你还必须使用\ uXXXX或\ uXXXXXXXX作为unicode(至少在gcc中它是unicode)

g ++中的标识符(变量/类名等)不能是utf-8/utf-16或其他任何编码,它们必须是:

identifier:
  nondigit
  identifier nondigit
  identifier digit
Run Code Online (Sandbox Code Playgroud)

一个非数字是

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
Run Code Online (Sandbox Code Playgroud)

而且是一个普遍的特征

universalcharactername:
  \UXXXXXXXX
  \uXXXX
Run Code Online (Sandbox Code Playgroud)

因此,如果将源文件保存为UTF-8,则不能使用如下变量:

int høyde = 10;
Run Code Online (Sandbox Code Playgroud)

它必须写成:

int h\u00F8yde = 10;
Run Code Online (Sandbox Code Playgroud)

(imo会击败整个目的 - 所以只要坚持使用az)

  • 铿锵有更好的支持吗? (3认同)
  • @anon **是**,从clang 3.3起[存在](http://llvm.org/releases/3.3/tools/clang/docs/ReleaseNotes.html#extended-identifiers-unicode-support-and-universal -character-names)在utf-8中支持unicode标识符。 (3认同)
  • @anon是的,clang允许在标识符中使用重音符号。 (2认同)

小智 5

C++ 预处理器的一行补丁允许 UTF-8 输入。GCC 的详细信息在 GCC 中的 UTF-8 Identifiers中给出。

但是,由于预处理器是共享的,因此相同的补丁也应该适用于 g++。特别是,从 gcc-5.2 开始,所需的补丁是

diff -cNr gcc-5.2.0/libcpp/charset.c gcc-5.2.0-ejo/libcpp/charset.c
Run Code Online (Sandbox Code Playgroud)

输出:

*** 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;
Run Code Online (Sandbox Code Playgroud)

请注意,要使上述补丁发挥作用,需要安装支持C99转换的最新版本iconv。键入以验证这一点。否则,您可以安装新版本的 iconv 以及 GCC,如上面的链接所述。iconv --list

将配置命令更改为

../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++"
Run Code Online (Sandbox Code Playgroud)

如果您正在为 x86 构建并且还想包含 C++ 编译器。