LLVM-лязг; имена функций / переменных, содержащие символы Юникода - PullRequest
5 голосов
/ 04 апреля 2010

Меня интересует использование символов юникода (например, \ apha) в именах функций / переменных в моей программе на С ++, которую я буду компилировать с помощью clang ++ в linux. Кто-нибудь знает хорошее руководство / список правил, чтобы убедиться, что все в конечном итоге компилируется нормально / избегая ошибок компоновки / ...

Спасибо!

1 Ответ

5 голосов
/ 18 января 2012

Clang 3.0 не поддерживает символы Unicode в идентификаторах. Последняя магистраль имеет частичную поддержку для этого, и я полагаю, что кто-то в настоящее время работает над тем, чтобы полностью реализовать это.

Что касается того, когда Clang поддерживает их, взгляните на C ++ 11 (n3242) 2.11 [lex.name].

Все символы в идентификаторе должны совпадать с [a-zA-Z_0-9] или набором символов в 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

Первый символ должен соответствовать [a-zA-Z_] или E.1, исключая E.2:

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

Что касается линковки, нам нужно взглянуть на C ++ ABI, который вы используете. В этом случае (Clang и Linux) это будет ABI Itanium C ++.

И ... после поисков навсегда, единственные вещи, которые я мог найти, были на JNI и на внутреннем устройстве gcc. Когда Clang это реализует, он будет использовать тот же mangling, что и gcc. В любом случае, пока весь код, который вы компилируете с использованием идентификаторов Юникода, компилируется с помощью одного и того же компилятора, он будет правильно связываться.

...