Разрешает ли C++11 знаки доллара в идентификаторах?
Разрешены ли знаки доллара в идентификаторах в C++03? охватывает, что знаки доллара в идентификаторах не разрешены в C++03. GCC предоставляет его как расширение C и правильно выдает диагностику в режиме C++ 03. Однако в C++ 11 int $ = 0
скомпилируется без предупреждения.
Этот ответ объясняет, что $
может быть разрешено, поскольку для идентификаторов, определенных для реализации, не требуется диагностика:
Ответ здесь "Возможно": Согласно §2.11, идентификаторы могут состоять из цифр и идентификаторов-нецифров, начиная с одной из последних. идентификаторы-нецифры являются обычным
a-z
,A-Z
и подчеркивание, кроме того, начиная с C++ 11 они включают в себя имена универсальных символов (например,\uBEAF
,\UC0FFEE32
) и другие символы, определяемые реализацией. Так что реализация определяется, если использовать$
в идентификаторе разрешено. VC10 и выше поддерживает это, возможно, и более ранние версии. Он даже поддерживает идентификаторы, такие какこんばんわ
,Но я бы их не использовал. Сделайте идентификаторы максимально удобочитаемыми и переносимыми.
$
определяется реализацией и поэтому не является переносимым.
Этот язык также присутствует в стандарте C++ 03, поэтому я не считаю это очень убедительным аргументом.
§2.10 / 2
Кроме того, некоторые идентификаторы зарезервированы для использования реализациями C++ и стандартными библиотеками (17.6.4.3.2) и не должны использоваться иначе; Диагностика не требуется.
Что позволяет изменение в стандарте $
использоваться в качестве имени идентификатора?
2 ответа
Это поведение, определяемое реализацией, $
не входит в грамматику для идентификаторов. Правила для имен идентификаторов в C++11:
- Не может начинаться с цифры
- Может состоять из букв, цифр, подчеркивания, имен универсальных символов и символов, определенных для реализации
- Не может быть ключевым словом
Определенные реализацией символы разрешены, и многие компиляторы поддерживают их как расширение, включая gcc, clang
Visual Studio и, как отмечено в комментарии, по- видимому, DEC C++ компиляторы.
Грамматика описана в разделе стандарта C++. 2.11
Indentifier, я добавил дополнительные заметки, начиная с <-
:
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;
^
Я так не думаю. Знак доллара в ASCII 0x24, который не входит ни в один из диапазонов, определенных в приложении E.1 (charname.allowed) стандарта. А поскольку он не является ни цифрой, ни цифрой, он должен быть символом, определяемым реализацией. Я согласен с тем, что это не переносимый C++11. Также обратите внимание, что идентификатор не должен начинаться с универсального символа, хотя он позволяет идентификатору начинаться с символа, разрешенного реализацией.