В предложении @Zaibis (и в связи с моим собственным ответом на Каковы допустимые символы для имен макросов?, а также 😃 (и другие символы Юникода) в идентификаторах, недопустимых g++))...
clang позволяет много "сумасшедших" персонажей. Хотя я изо всех сил пытался найти много рифмы или разума - о том, почему некоторые из них разрешены (🔴 ϟ ツ ⌘ ☁ ½), а другие нет (▶ ︎ ∀ ★ ©).
Например, следующее компилирует A-OK (clang-700.1.76
)
#define 💩 ?: // OK (Pile of poo)
#define ■ @end // OK (HALFWIDTH BLACK SQUARE)
#define 🅺 @interface // OK (NEGATIVE SQUARED LATIN CAPITAL LETTER K)
#define P @protocol // OK (FULLWIDTH LATIN CAPITAL LETTER P)
все же все результаты приводят к той же ошибке компилятора...
Macro name must be an identifier.
#define ☎ TEL
#define ❌ NO
#define ⇧ UP
#define 〓 ==
#define 🍎 APPLE
clang
Документы ссылаются на проблему, указав только...
... поддержка расширенных идентификаторов в C99 и С++. Эта функция позволяет идентификаторам содержать определенные символы Юникода, как указано стандартом активного языка; эти символы могут быть записаны непосредственно в исходном файле с использованием кодировки UTF-8 или упомянуты с использованием универсальных имен символов (\ u00E0,\U000000E0).
Итак, я думаю, я спрашиваю.. что такое "стандарт активного языка" и как я могу найти авторитетный источник для того, какие идентификаторы являются законными.
Я создал следующий код, чтобы увидеть, что с ним будет делать clang
. Из примерно 63488 возможных идентификаторов проверено 23 предупреждения и 9506 сгенерированных ошибок. Это оставляет почти 54 000 действительных символов для использования в идентификаторах. Конечно, достаточно, но кто режет? И почему?