Предоставляет ли С++ 11 значки доллара в идентификаторах?
Знаки доллара, разрешенные в идентификаторах в С++ 03?, показывают, что знаки доллара в идентификаторах не разрешены в С++ 03. GCC предоставляет его как расширение C и правильно дает диагностику в режиме С++ 03. Однако в С++ 11 int $ = 0
будет компилироваться без предупреждения.
Этот ответ объясняет, что $
может быть разрешен, потому что для реализации определенных идентификаторов не требуется диагностика:
Ответ здесь "Возможно" . Согласно §2.11, идентификаторы может состоять из цифр и идентификаторов-недигитов, начиная с одного последней. идентификаторы-недигиты являются обычными a-z
, a-z
и подчеркивание, кроме того, поскольку С++ 11 включают универсальные имена символов (например, \uBEAF
, \UC0FFEE32
), и другие символы, определенные реализацией. Таким образом, это реализация определена если использование $
в идентификаторе разрешено. VC10 и выше поддерживают это, возможно, более ранние версии. Он поддерживает даже такие идентификаторы, как こんばんわ
.
Но: Я бы не использовал их. Сделайте идентификаторы максимально читабельными и переносимыми. $
- это реализация, и, следовательно, не переносимым.
Этот язык присутствует и в стандарте С++ 03, поэтому я не считаю это очень убедительным аргументом.
§2.10/2
Кроме того, некоторые идентификаторы зарезервированы для использования С++ реализаций и стандартных библиотек (17.6.4.3.2) и не должны быть используется иначе; диагностика не требуется.
Какое изменение в стандарте позволяет использовать $
в качестве имени идентификатора?
Ответы
Ответ 1
Это поведение, определяемое реализацией, $
не включено в грамматику для идентификаторов. Правилами имен идентификаторов в С++ 11 являются:
- Он не может начинаться с числа
- Может состоять из букв, цифр, подчеркивания, универсальных имен символов и определенных символов реализации
- Не может быть keyword
Разрешены определенные пользователем символы, и многие компиляторы поддерживают как расширение, включая gcc, clang
, Visual Studio и как отмечено в comment, по-видимому, DEC С++ компиляторы.
Грамматика описана в черновик стандарта С++ 2.11
Отступы, я добавил дополнительные примечания, начиная с <-
:
identifier:
identifier-nondigit <- Can only start with a non-digit
identifier identifier-nondigit <- Next two rules allows for subsequent
identifier digit <- characters to be those outlined in 2 above
identifier-nondigit:
nondigit <- a-z, A-Z and _
universal-character-name
other implementation-defined characters
[...]
Если мы скомпилируем этот код с помощью clang
с флагом -pedantic-errors
, он не скомпилируется:
int $ = 0
и генерирует следующую ошибку:
error: '$' in identifier [-Werror,-Wdollar-in-identifier-extension]
int $ = 0;
^
Ответ 2
Я так не думаю. Знак доллара находится в ASCII 0x24, который не находится ни в одном из диапазонов, определенных в приложении E.1 (charname.allowed) стандарта. И поскольку он не является ни цифрой, ни недигитированной, он должен быть характерным для реализации символом. Таким образом, я уверен, что это не портативный С++ 11. Также обратите внимание, что идентификатор не должен начинаться с универсального символа, в то время как он позволяет идентификатору начинать с символа, допускаемого реализацией.