c++ - 😃(和其他 Unicode 字符)在 g++ 不允许的标识符中

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

我是 😞发现我不能使用😃作为 g++ 4.7 的有效标识符,即使启用了 -fextended-identifiers 选项:

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

main.cpp:3:3: error: stray ‘\360’ in program
main.cpp:3:3: error: stray ‘\237’ in program
main.cpp:3:3: error: stray ‘\230’ in program
main.cpp:3:3: error: stray ‘\203’ in program

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

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

main.cpp:3:15: error: universal character \U0001F603 is not valid in an identifier

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

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

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

最佳答案

从 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 的第二段代码确实有效。即使使用 -finput-charset=UTF-8 和 GCC 8.2 on https://gcc.godbolt.org,我仍然无法使用 😃 获得实际代码。不过(您可能想关注 this bug report ,由 @DanielWolf 提供)。

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

关于c++ - 😃(和其他 Unicode 字符)在 g++ 不允许的标识符中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12692067/

相关文章:

c++ - 尝试 std::lock[_unique] std::shared_mutex 的线程是否会被调用 std::lock_shared 的线程饿死?

c++ - 我可以从模板访问结构/类成员吗?

linux - CentOS上本地安装gcc

c - 哪个免费的 C 编译器提供了更好的优化选项?

ubuntu - 无法在 Web 浏览器中显示 Unicode 字符?

c# - 寻找 PDF 文件解析器

c++ - 私有(private)类函数与未命名命名空间中的函数

c++ - 在纯 native 代码中使用托管对象

使用不同的堆栈指针调用 C 函数 (gcc)

python - 如何使用 BeautifulSoup 将 UTF-8 编码的 HTML 正确解析为 Unicode 字符串?