Jos*_*eld 56 c++ unicode gcc g++ c++11
我是 发现我不能用 作为g ++ 4.7的有效标识符,即使-fextended-identifiers
启用了该选项:
int main(int argc, const char* argv[])
{
const char* = "I'm very happy";
return 0;
}
Run Code Online (Sandbox Code Playgroud)
main.cpp:3:3:错误:stogram'\ 360'在程序
main.cpp中:3:3:错误:stray'\ 237'在程序
main.cpp中:3:3:错误:stray'\'230'in程序
main.cpp:3:3:错误:在程序中迷路'\ 203'
经过一些谷歌搜索后,我发现标识符中尚不支持UTF-8字符,但通用字符名称应该有效.所以我将我的源码转换为:
int main(int argc, const char* argv[])
{
const char* \U0001F603 = "I'm very happy";
return 0;
}
Run Code Online (Sandbox Code Playgroud)
main.cpp:3:15:错误:通用字符\ U0001F603在标识符中无效
所以显然不是有效的标识符字符.但是,该标准特别允许来自10000-1FFFD
附件E.1 范围内的字符,并且不允许它作为E.2中的初始字符.我的下一个努力是看看是否有任何其他允许的unicode字符工作 - 但我没有尝试过.甚至不是重要的PILE OF POO()角色.
那么,为了有意义和描述性的变量名称,给出了什么?请问-fextended-identifiers
这样做,因为它会公布或不?它是否仅在最新版本中得到支持?其他编译器有什么样的支持?
ken*_*ytm 20
从4.8开始,gcc不支持用作标识符的BMP之外的字符.这似乎是一个不必要的限制.此外,gcc仅支持ucnid.tab中描述的一组非常有限的字符,基于C 99和C++ 98(它似乎尚未更新到C11和C++ 11).
如手册中所述,-fextended-identifiers
是实验性的,因此它有更高的机会无法按预期工作.
编辑:
GCC支持从4.9.0开始的C11字符集(准确地说是svn r204886).所以OP的第二段代码\U0001F603
确实有效.我仍然无法使用实际代码 to work even with
-finput-charset=UTF-8
与GCC 8.2 https://gcc.godbolt.org虽然(您可能要遵循这个bug报告,提供@DanielWolf).
同时,这两段代码都在clang 3.3上运行,没有任何选项-std=c++11
.
这是GCC中的已知错误:错误67224 - 对GCC中的标识符名称的UTF-8支持.
错误报告来自2015年,并且有一个相当长的讨论.在某些时候,它提到"对这个功能似乎没有足够的需求,以便公司资助它或志愿者加紧实施它."
因此,如果您发现此StackOverflow主题正在寻找解决方案,您可能希望在此处添加讨论以显示实际上存在需求.
但是,该标准特别允许附件E.1中10000-1FFFD范围内的字符,并且不允许它作为E.2中的初始字符.
要记住的一件事是,仅仅因为C++标准允许(或禁止)某些功能,并不一定意味着您的编译器支持(或不支持)该功能.