2014-10-30 36 views
5

此問題的unicode文本可能無法在所有瀏覽器中正確顯示。Unicode中的變量名稱中的特殊字符不允許使用?

clang現在(> 3.3)支持變量名http://llvm.org/releases/3.3/tools/clang/docs/ReleaseNotes.html#major-new-features Unicode字符。

但是有些特殊字符仍然被禁止。

int main(){ 
    double α = 2.; // alpha, ok! 
    double ∞ = 99999.; // infinity, error 
} 

,並提供:

error: non-ASCII characters are not allowed outside of literals and identifiers 
     double ∞ = 99999.; 

是什麼clangα(阿爾法)和(infinty)之間的根本區別?前者是unicode,後者不是unicode,但同時不是ASCII碼?

是否有解決方法或選項允許clang(或順便說一句,gcc)中的這組字符?

注1):僅僅是一個例子,也有很多是潛在有用的,但也被禁止,如字符。 2)我不是問這是否是個好主意,請把它當作技術性問題。 3)我對Linux中的clang 3.4的C++編譯器感興趣(gcc 4.8.3不支持這個)。我使用UTF-8編碼和Unix/Linux行結尾保存源文件爲gedit。 4)添加其他正常的第一字符不幫助:_∞


的答案指向一個明確的NO。有些範圍確實不是 ,也不會很快。要進一步移動到總共 瘋狂,我發現的最佳選擇是使用 有效看起來相同的字符。 (現在,我可能會承認這不是一個好主意。)這些替代品可以在這裏找到 http://shapecatcher.com/。結果(如果對不起它傷害你的眼睛):

// double ∞ = 99999.; // still error 
// double ⧞ = 99999.; // infinity negated still error 
    double ꝏ = 99999.; // letter oo 
    double Ꝏ = 99999.; // letter OO 
// double ⧜ = 99999.; // incomplete infinity still error 

其他「另類」死在那些允許範圍內的問題提到振鈴:ʃ

+0

這些名字是一個可怕的想法。你想用這個做什麼?某種模糊比賽? – stefan 2014-10-30 18:15:58

+2

@stefan:據推測,編寫看起來像數學符號的代碼。如果目標受衆是數學家,這不是一個壞主意。 – 2014-10-30 18:19:28

+0

@MikeSeymour我是一名數學家,我討厭它;-)但足夠公平。雖然它是不可移植的。這是任何事情的最大缺點。 – stefan 2014-10-30 18:20:48

回答

9

所以clang文件說(重點煤礦):

此功能允許標識符包含某些Unicode字符, 由主動語言標準規定;

這被覆蓋在draft C++ standard附件E,都是允許的字符如下:

字符E.1範圍所容許[charname.allowed]

00A8,00AA, 00AD,

00AF,00B2-00B5,00B7-00BA,00BC-00BE,00C0-00D6,00D8-00F6,00F8-00FF

0100-167F,1681-180D,180F-1FFF 200B-200D,202A-202E,203F-2040,2054,

2060-206F 2070-218F,2460-24FF,2776-2793,2C00-2DFF,2E80 -2FFF

3004-3007,3021-302F,3031-303F

3040-D7FF F900-FD3D,FD40-FDCF,

FDF0-FE44,FE47-FFFD

10000-1FFFD ,20000-2FFFD,30000-3FFFD, 40000-4FFFD,50000-5FFFD,60000-6FFFD,70000-7FFFD,80000-8FFFD, 90000-9FFFD,A0000-AFFFD,B0000-BFFFD,C0000-CFFFD,D0000-DFFFD, E0000-EFFFD

爲無窮大221E的代碼不包含在列表中。

僅供參考:以上代碼轉換爲unicode字符(其中一些可能無法在所有瀏覽器/可用字體中正確顯示)。

¨, ª, ­, 

¯, ²-µ, ·-º, ¼-¾, À-Ö, Ø-ö, ø-ÿ 

Ā-ᙿ, ᚁ-᠍, ᠏-῿ ​-‍, ‪-‮, ‿-⁀, ⁔, 

⁠- ⁰-↏, ①-⓿, ❶-➓, Ⰰ-ⷿ, ⺀-⿿ 

〄-〇, 〡-〯, 〱-〿 

぀-퟿ 豈-ﴽ, ﵀-﷏, 

ﷰ-﹄, ﹇-� 

-, -, -, -, -, -, -, -, -, -, -, -, -, - 

我找不到一個廣泛的文件,涵蓋了選擇,雖然N3146: Recommendations for extended identifier characters for C and C++範圍的理由確實提供了有關影響的一些細節。

+0

如果你不介意,我使用這個工具http://rishida.net/tools/conversion/將你的代碼轉換成你的答案中的代表。謝謝。 – alfC 2014-10-30 18:47:15

+0

@alfC批准編輯 – 2014-10-30 18:58:58

+0

您是否知道用於選擇這些範圍的字符的標準? – alfC 2014-10-30 22:24:58

相關問題