我发现我无法使用作为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
做广告或不广告吗?它是否仅在最新版本中得到支持?其他编译器有什么样的支持?
答案 0 :(得分:18)
截至4.8,gcc does not support characters outside of the BMP used as identifiers。这似乎是一个不必要的限制。此外,gcc仅支持ucnid.tab中描述的非常有限的一组字符,基于C 99 和C ++ 98 (它未更新为C11和C + +11,但似乎)。
正如手册-fextended-identifiers
is experimental中所述,因此它有更高的机会无法按预期工作。
修改:
GCC支持C11字符集starting from 4.9.0(确切地说svn r204886)。所以OP使用\U0001F603
的第二段代码确实有效。我仍然无法使用获取实际代码,即使https://gcc.godbolt.org上的
-finput-charset=UTF-8
与GCC 8.2一起工作(您可能需要关注this bug report,@DanielWolf提供3}})。
同时,两段代码都在clang 3.3上工作,没有-std=c++11
以外的任何选项。
答案 1 :(得分:7)
这是GCC中的已知错误:Bug 67224 - UTF-8 support for identifier names in GCC。
错误报告来自2015年,并且有一个相当长的讨论。在some point,它提到“对此功能似乎没有足够的需求,以便公司资助它或志愿者加紧实施它。”
因此,如果您发现此StackOverflow主题正在寻找解决方案,您可能希望在此处添加讨论以显示实际上存在需求。
答案 2 :(得分:5)
但是,该标准特别允许附件E.1中10000-1FFFD范围内的字符,并且不允许它作为E.2中的初始字符。
要记住的一件事是,仅仅因为C ++标准允许(或禁止)某些功能,并不一定意味着您的编译器支持(或不支持)该功能。