【问题标题】:???? (and other Unicode characters) in identifiers not allowed by g++??? (和其他 Unicode 字符)在 g++ 不允许的标识符中
【发布时间】:2012-09-23 09:52:30
【问题描述】:

我是 ???? 发现我无法使用 ???? 作为 g++ 4.7 的有效标识符,即使启用了 -fextended-identifiers 选项:

int main(int argc, const char* argv[])
{
  const char* ???? = "I'm very happy";
  return 0;
}

main.cpp:3:3: 错误:程序中出现杂散“\360”
main.cpp:3:3:错误:程序中出现“\237”
main.cpp:3:3: 错误:程序中出现“\230”错误
main.cpp:3:3: 错误:程序中出现“\203”

经过一番谷歌搜索,我发现UTF-8 characters are not yet supported in identifiers,但通用字符名称应该可以工作。所以我将我的源代码转换为:

int main(int argc, const char* argv[])
{
  const char* \U0001F603 = "I'm very happy";
  return 0;
}

main.cpp:3:15: 错误:通用字符 \U0001F603 在标识符中无效

那么显然????不是有效的标识符字符。但是,该标准在附件 E.1 中明确允许 10000-1FFFD 范围内的字符,并且不允许在 E.2 中将其作为初始字符。

我接下来的工作是查看是否有任何其他允许的 Unicode 字符有效 - 但我尝试过的都没有。甚至连最重要的PILE OF POO (????) 字符都没有。

那么,为了有意义和描述性的变量名称,什么给出了? -fextended-identifiers 是否按照它所宣传的那样做?它仅在最新版本中支持吗?其他编译器有什么样的支持?

【问题讨论】:

  • 只是好奇:那些必须维护你的代码的人对你做了什么可怕的事情来让你得到像\U0001F603这样的标识符?
  • 他们称它为 C/C++ - 这是合理的。
  • “为了有意义和描述性的变量名称” - ROFLMAO?对不起,我的意思是????。
  • 问题是:“那么,为了有意义和描述性的变量名称,什么给出了?” --- 答案是:“停止胡闹,重新开始工作”。 :-)
  • 该死,我想????是我一直在使用的课程的最合适的名称。

标签: c++ gcc unicode c++11 g++


【解决方案1】:

从 4.8 开始,gcc does not support characters outside of the BMP used as identifiers。这似乎是一个不必要的限制。此外,gcc 仅支持ucnid.tab 中描述的非常有限的字符集,基于 C99 和 C++98(它未更新到 C11 和 C++11然而,似乎)。

如手册中所述,-fextended-identifiers is experimental,因此它更有可能无法按预期工作。


编辑:

GCC 支持 C11 字符集starting from 4.9.0(准确地说是svn r204886)。所以OP使用\U0001F603的第二段代码确实有效。即使在https://gcc.godbolt.org 上使用带有GCC 8.2 的-finput-charset=UTF-8,我仍然无法使用? 获得实际代码(您可能需要关注this bug report,由@DanielWolf 提供)。

同时,这两段代码都可以在 clang 3.3 上运行,除了 -std=c++11 之外没有任何选项。

【讨论】:

  • main.cpp:3:15: error: universal character \u00a8 is not valid in an identifier 怎么样?不过,这是 4.7 的版本。
【解决方案2】:

这是 GCC 9 及之前版本中的 known bug。 GCC 10 中的 has been fixed

GCC 10 的 official changelog 包含以下部分:

除了已经支持的 UCN 语法(\uNNNN\UNNNNNNNN)之外,现在可以在输入编码(默认为 UTF-8)中直接指定标识符中的扩展字符:

static const int π = 3;
int get_naïve_pi() {
  return π;
}

【讨论】:

    【解决方案3】:

    但是,该标准在附件 E.1 中明确允许 10000-1FFFD 范围内的字符,并且不允许在 E.2 中将其作为初始字符。

    要记住的一点是,仅仅因为 C++ 标准允许(或禁止)某些功能,并不一定意味着您的编译器支持(或不支持)该功能。

    【讨论】:

    • 是的,允许标准指定的全套 Unicode 字符,据我所知,目前还没有编译器支持,无论是字面意思还是 UCN。
    • 当然!我只是想找到一些表明他们不支持此功能的文档或来源。
    • @sftrabbit 好的,也许我的回答指出了显而易见的问题。 KennyTM 给出了链接:gcc。
    猜你喜欢
    • 1970-01-01
    • 2011-02-18
    • 2015-07-30
    • 2011-06-17
    • 2011-06-15
    • 2011-04-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多