2010-04-03 8 views
5

Jestem zainteresowany używaniem znaków Unicode (takich jak \ apha) w nazwach funkcji/varaible w moim programie C++, który skompiluję z clang ++ na linuxie. Czy ktokolwiek wie o dobrym przewodniku/liście zasad, które należy spełnić, aby upewnić się, że wszystko kończy się kompilowaniem dobrych/unikaniem błędów linkowania/...llvm-clang; nazwy funkcji/zmiennych zawierające znaki Unicode

Dzięki!

+0

Po prostu z ciekawości, czy migrujesz z APL? –

+0

'clang ++' 3.4 obsługuje to. Od wersji 3.3 (http://llvm.org/releases/3.3/tools/clang/docs/ReleaseNotes.html#major-new-features) – alfC

Odpowiedz

5

Klang 3.0 nie obsługuje znaków Unicode w identyfikatorach. Ostatni bagażnik ma częściową obsługę tego i wydaje mi się, że obecnie ktoś pracuje nad jego pełnym wdrożeniem.

Co do tego, kiedy Clang je obsługuje, spójrz na C++ 11 (n3242) 2.11 [lex.name].

Wszystkie znaki identyfikatora musi pasować [a-zA-Z_0-9] lub zestawu znaków w E.1:

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-EFFF 

Pierwszy znak musi odpowiadać [a-zA-Z_] lub E.1 wyłączeniem E.2:

0300-036F, 1DC0-1DFF, 20D0-20FF, FE20-FE2F 

Jeśli chodzi o łączenie, musimy przyjrzeć się używanemu przez nas C++ ABI. W tym przypadku (Clang i Linux) będzie to ABI Itanium C++.

I ... po przeszukiwaniu na zawsze jedyne rzeczy, jakie mogłem znaleźć, dotyczyły JNI i wewnętrznych elementów gcc. Kiedy Clang to zaimplementuje, użyje tego samego manglingu co gcc. Tak czy inaczej, o ile cały kod kompilowany przy użyciu identyfikatorów Unicode jest kompilowany z tym samym kompilatorem, będzie on poprawnie łączył.