😃(和其他unicode字符)不能被g ++识别的标识符

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

 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'

经过一些Googlesearch之后,我发现UTF-8字符在标识符中还不被支持,但通用字符名称应该可以工作。 所以我把我的源代码转换为:

 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字符的工作 – 但我没有试过。 公安条例(💩)的性质甚至不重要。

所以,为了有意义和描述性的variables名称,是什么给了? -fextended-identifiers是否按照广告宣传? 它只在最新版本中被支持吗? 其他编译器有什么样的支持?

从4.8开始, gcc不支持用作标识符的BMP以外的字符 。 这似乎是一个不必要的限制。 此外,gcc只支持ucnid.tab中描述的非常有限的一组字符,基于C99和C ++ 98 (它不会更新到C11和C ++ 11,看来)。

如手册中所述, -fextended-identifiers是实验性的 ,因此具有较高的机会将无法按预期工作。


编辑:

GCC支持从4.9.0开始的C11字符集( 准确地说是svn r204886 )。 所以OP的第二段使用\U0001F603的代码确实有效。 虽然( https://gcc.godbolt.org)上的GCC 7使用-finput-charset=UTF-8 ,我仍然无法使用😃来获得实际的代码(您可能想要关注这个由@ DanielWolf )。

同时这两个代码片段工作在铛3.3没有任何选项,除了-std=c++11

但是,该标准特别允许附件E.1中的范围为10000-1FFFD的字符,并且不允许它作为E.2中的初始字符。

有一件事要记住,就是因为C ++标准允许(或不允许)某些function,并不一定意味着你的编译器支持(或不支持)该function。

这是GCC中的一个已知错误: 错误67224 – UTF-8支持GCC中的标识符名称 。

这个错误报告是从2015年开始的,有一个相当长的讨论。 在某种程度上 ,它提到“这个function似乎没有足够的需求,所以公司提供资金或志愿者加紧实施。”

所以,如果你发现这个StackOverflow主题寻找一个解决scheme,你可能想添加到那里的讨论,以显示,实际上,需求。