Зарезервированные имена в глобальном пространстве имен - PullRequest
5 голосов
/ 12 марта 2012

Исходя из моего ответа на Динамический массив объектов в C ++ и, как следствие, до Каковы правила использования подчеркивания в идентификаторе C ++? : очевидно, имена начинаются_, за которым следует заглавная буква, зарезервированы в глобальном пространстве имен.

17.4.3.2.1 Глобальные имена [lib.global.names]

Определенные наборы имен и сигнатур функций всегда зарезервированы для реализации:

  • Каждое имя, которое содержит двойное подчеркивание (__) или начинается с подчеркивания, за которым следует заглавная буква (2.11), зарезервировано для реализации для любого использования.
  • Каждое имя, начинающееся с подчеркивания, зарезервировано дляреализация для использования в качестве имени в глобальном пространстве имен. 165

165) Такие имена также зарезервированы в пространстве имен ::std (17.4.3.1).

В моем ответе на первый вопрос у меня был класс, похожий на этот

class A
{
 private:
   vector<int> _Ints;
}

В комментариях мне сказали, что идентификатор _Ints вызывает неопределенное поведение,так как это зарезервированное имя.Однако, согласно недавнему проекту стандарта, поиск имени переменной-члена происходит с использованием следующего правила:

3.4.3.1 Члены класса [class.qual]

Если спецификатор вложенного имени из квалифицированного идентификатора назначает класс, имя, указанное после спецификатора вложенного имени , ищется в области действиякласс (10.2), за исключением случаев, перечисленных ниже.Имя должно представлять одного или нескольких членов этого класса или одного из его базовых классов

Для меня это означает, что ни одна переменная-член не может быть частью глобального пространства имен, поскольку ее область действия являетсяclass.

А теперь вопрос:

Правильно ли мое понимание того, что переменные-члены никогда не будут нарушать правило зарезервированных имен реализации, поскольку они не находятся в глобальном пространстве имен?Если я не прав, может ли кто-нибудь объяснить моё неправильное понимание правила поиска?

Ответы [ 3 ]

6 голосов
/ 12 марта 2012

_Int явно нарушает первое правило: «Каждое имя, которое содержит двойное подчеркивание (_ _) или начинается с подчеркивания, за которым следует заглавная буква (2.11), зарезервировано для реализации для любого использования». «Любое использование»Означает именно то, что написано: это может быть предопределенный макрос, или вызвать какое-то особое поведение в компиляторе, или все, что хочет автор компилятора.Неважно, где вы используете имя, если вы его используете, это неопределенное поведение (если в документации компилятора не указано иное).

В целом, исторически, по крайней мере, компиляторы были довольно слабыми, и числоСистемные заголовки традиционно включают макросы, имена которых начинаются с одного подчеркивания, за которым следует строчная буква.Вероятно, лучше всего избегать их.(Исторически, даже, были имена без подчеркивания. Я знаю, что у меня были проблемы с тем, что имя linux становится 1. Подчеркивания не видно, но ... С этим мало что можно поделатьоднако, за исключением изменения имени при возникновении конфликта.)

В более общем смысле подчеркивания не очень хорошо отображаются в некоторых шрифтах, и лучше избегать их на любом конце символа.

2 голосов
/ 12 марта 2012

Правила, которые вы цитировали из стандарта, гласят, что идентификатор, начинающийся с символа подчеркивания, за которым следует заглавная буква, зарезервирован для любого использования , а не только в глобальном пространстве имен.Поэтому именование переменной-члена _Ints недопустимо.

Идентификаторы, начинающиеся с подчеркивания, за которым не следует подчеркивание или заглавная буква, зарезервированы в глобальном пространстве имен.Так, например, вам разрешено именовать переменную-член _ints, но вы не можете иметь глобальную переменную с именем _ints, которая находится в глобальном пространстве имен.

1 голос
/ 12 марта 2012

очевидно _ (заглавная буква) зарезервировано в глобальном пространстве имен.

Нет.Зарезервировано везде .Прочтите снова 17.4.3.2.1:

Каждое имя, которое содержит двойное подчеркивание (_ _) или начинается с подчеркивания, за которым следует заглавная буква (2.11), зарезервировано для реализации для любого использования.

Здесь вообще не упоминается «глобальное пространство имен» (глобальное пространство имен имеет значение только в следующем правиле).

...