Если мы посмотрим на реализацию GNU libstdc++, я заметил, что в реализациях стандартных классов частные функции-члены различных классов имеют префикс _M_
. Например, у std::basic_string<>
среди прочих есть член по имени bool _M_is_shared() const;
.
Я понимаю мотивацию иметь какое-то соглашение об именах для частных переменных-членов. Это помогает визуально различать члены класса и локальные переменные функции. Но я не понимаю, почему префикс _M_
предпочтительнее для закрытых функций-членов.
Если я вижу какой-то код, который вызывает, например: is_shared();
, по сути, есть только несколько вариантов:
- это функция-член этого класса
- это функция-член родительского класса
- это глобальная функция.
Первые два будут иметь префикс, так что это не поможет. Последнее не произойдет ни в одной разумной реализации из-за проблем с загрязнением пространства имен. Единственные глобальные переменные, которые должна вводить библиотека, — это предписанные стандартом. Итак, суть вопроса...
Поскольку частные функции-члены не являются общедоступными. Никак не может повлиять на производные классы. Я не думаю, что конфликты имен здесь действительно вызывают беспокойство... и в основном это не более чем частные детали реализации. Зачем возиться с (IMO) уродливым префиксом _M_
? Есть ли в стандарте что-то, что запрещает вводить дополнительных приватных членов? Если это так, то это показалось бы мне глупым, если только я ничего не упускаю.
__foo
для локальных переменных и аргументов и_M_foo
или_S_foo
для членов, но в обоих случаях мы должны использовать зарезервированные имена, чтобы гарантировать, что мы не конфликтуем с какими-либо макросами, определенными пользователями. - person Jonathan Wakely   schedule 25.03.2014