Разрешает ли 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:

  1. Не может начинаться с цифры
  2. Может состоять из букв, цифр, подчеркивания, имен универсальных символов и символов, определенных для реализации
  3. Не может быть ключевым словом

Определенные реализацией символы разрешены, и многие компиляторы поддерживают их как расширение, включая 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. Также обратите внимание, что идентификатор не должен начинаться с универсального символа, хотя он позволяет идентификатору начинаться с символа, разрешенного реализацией.

Другие вопросы по тегам