В соответствии с документацией, которую я читал ранее, правила для идентификаторов были в основном:
- В начале нет двойного подчеркивания - потому что они зарезервированы.
- Нет одинарныхсимволы подчеркивания и верхнего регистра - тоже зарезервированы.
Такие идентификаторы действительно зарезервированы, но это означает, что you не должен их объявлять или определять, а не то, что они не могутбыть идентификаторами или что они обязательно не имеют смысла.
- Должен начинаться с буквы, не цифры.
Буквы действительно нецифры, но не все цифры не являются буквами.Символ _
является ярким примером.
- Не должен превышать 31 символ.
Это не формальное ограничение языка.C требует, чтобы реализации поддерживали не менее 31 значимых символов во внешних идентификаторах.Два внешних идентификатора, которые отличаются только символом 32 nd или более поздним, не гарантируются для распознавания как отличные, но они не обязательно являются идентификаторами.Кроме того, реализации должны распознавать как минимум 63 значащих символа во внутренних идентификаторах, что, опять же, может быть длиннее.
Некоторые реализации распознают более значимые символы, а некоторые даже неограниченное число.
- Может содержать az, AZ или 0-9 и _.
Да, но в явном виде также может содержать другие определяемые реализацией символы.В частности, символ $
разрешен довольно часто.
Так почему же Clang разрешает мне это делать, хотя по стандартам ANSI этого не должно быть?Даже GCC 6, который я установил, не предупреждал об этом и не выдавал ошибку.
Стандарт никоим образом не говорит, что идентификаторы, содержащие символ $
, запрещены.Он явно разрешает реализациям принимать этот символ и, по существу, любые другие идентификаторы, хотя есть некоторые, которые не могут быть прагматически разрешены, поскольку их разрешение может привести к двусмысленности.Программы, которые используют идентификаторы, содержащие такие символы, по этой причине не соответствуют, и реализации, которые принимают их, по этой причине не соответствуют.Однако такие программы не могут строго соответствовать, поскольку этот термин определяется стандартом.