我在新的C++标准中找到了
2.11 Identifiers [lex.name]
identifier:
identifier-nondigit
identifier identifier-nondigit
identifier digit
identifier-nondigit:
nondigit
universal-character-name
other implementation-defined character
Run Code Online (Sandbox Code Playgroud)
附加文字
标识符是任意长的字母和数字序列.标识符中的每个通用字符名称应指定一个字符,其ISO 10646中的编码属于E.1中规定的范围之一.[...]
我无法理解这意味着什么.从旧的标准我习惯\u89ab,例如写一个"通用字符名称" .但是在标识符中使用那些......?真?
新标准对Unicode更加开放吗?而且我没有提到新的文字类型 "uHello \u89ab thing"u32,我想我理解了这些.但:
\u1234在里面写一个标识符myfu\u1234ntion(出于任何目的)或者我可以使用unicode在ICU中定义的"字符名称",即
const auto x = "German Braunb\U{LOWERCASE LETTER A WITH DIARESIS}r."u32;
Run Code Online (Sandbox Code Playgroud)
甚至在源本身的标识符中?这将是一种享受...... 咳嗽 ......
我认为答案给所有thise问题是没有,但我不能在标准的可靠映射这措辞... :-)
编辑:我找到了"2.2翻译阶段[lex.phases]",第1阶段:
如果需要,物理源文件字符以实现定义的方式映射到基本源字符集[...].接受的物理源文件字符集是实现定义的.[...]任何不在基本源字符集(2.3)中的源文件字符都将替换为指定该字符的通用字符名称.(实现可以使用任何内部编码,只要在源文件中遇到实际扩展字符,并且在源文件中表示为与通用字符名称相同的扩展字符(即,使用\ uXXXX表示法),处理等效,除非在原始字符串文字中还原此替换.)
通过阅读本文,我现在认为,编译器可以选择接受UTF-8,UTF-16或它希望的任何代码页(通过元信息或用户配置).在阶段1中,它将其转换为ASCII格式("基本源字符集"),然后用其\uNNNN符号替换Unicode字符(或者编译器可以选择继续以其Unicode表示形式工作,但不得不确保它\uNNNN以相同的方式处理另一个.
你怎么看?
此问题具有可能无法在所有浏览器中正确显示的unicode文本.
clang现在(> 3.3)支持Unicode字符变量名 http://llvm.org/releases/3.3/tools/clang/docs/ReleaseNotes.html#major-new-features.
然而一些特殊的角色仍然被禁止.
int main(){
double ? = 2.; // alpha, ok!
double ? = 99999.; // infinity, error
}
Run Code Online (Sandbox Code Playgroud)
赠送:
error: non-ASCII characters are not allowed outside of literals and identifiers
double ? = 99999.;
Run Code Online (Sandbox Code Playgroud)
?(alpha)和?(infinty)之间的根本区别是什么clang?前者是unicode而后者不是unicode但同时不是ASCII?
是否有解决方法或选项允许这组字符clang(或BTW in gcc)?
注意:1)?只是一个例子,有很多字符可能有用但也被禁止,比如?或?.2)我不是在问这个好主意,请把它作为技术问题.3)我对clang 3.4Linux 中的C++编译器感兴趣(gcc 4.8.3不支持这个).我gedit使用UTF-8编码和Unix/Linux行结束保存源文件.4)添加其他正常的第一个字符无济于事:_?
答案指向肯定的NO.确实不允许某些范围,也不会很快.为了进一步向完全疯狂迈进,我发现的最佳选择是使用有效看起来相同的角色.(现在,这个我承认可能不是一个好主意.)这些替代可以在这里找到 http://shapecatcher.com/.结果(对不起,如果它伤害你的眼睛): …