могу ли я надежно избежать столкновения по пространству имен Atoi
?
Достоверно надежно. В стандартной библиотеке языка C нет идентификатора с таким именем.
Или это имя пространства имен в смешанном регистре, такое как Atoi, которое может быть растоптано будущим стандартом C ++, технической спецификацией (TS), библиотекой Boost, компилятором, цепочкой инструментов и т. Д .?
Весьма маловероятно.
Расширения компилятора должны использовать зарезервированные идентификаторы.
Новые идентификаторы стандартной библиотеки (включая TS) добавляются в пространство имен std
(или пространство имен, вложенное в std
). Boost должен добавить свои идентификаторы в пространство имен boost
.
Исключением являются макросы, которые не существуют в пространствах имен. Соглашение об усилении имен должно использовать префикс BOOST_
. Новые макросы стандартной библиотеки должны использовать зарезервированные идентификаторы.
Стандартная библиотека C, разумеется, не имеет пространств имен. В новой версии может быть добавлен незарезервированный макрос, хотя его следует добавить в новый заголовок, который не будет включать в себя уже существующая программа.
Немного более проблематичными являются стандартные заголовки POSIX, которые добавляют довольно много идентификаторов, которые не зарезервированы стандартом C в глобальном пространстве имен. Он добавляет довольно много зарезервированных префиксов и суффиксов в зависимости от того, какие заголовки POSIX включены.
Используя заглавную букву, за которой следует строчная буква, например, Atoi
, вы избегаете конфликтов с большинством резервирований POSIX и большинством стандартных имен, которые строго следуют условию всех строчных или прописных букв (обычно для макросов).
Чтобы свести к минимуму конфликты имен, вот мои эмпирические правила. Некоторым нужно обязательно следовать, другие - просто рекомендации:
- Никогда не используйте идентификаторы, зарезервированные стандартом, даже в пространствах имен.
- Избегайте макросов.
- Используйте постоянный префикс при именовании макросов.
- Объявите только одно пространство имен в глобальном масштабе, и никаких других глобальных идентификаторов.
- Объявите все остальное в этом пространстве имен.
- Совместное использование общего пространства имен для всех ваших проектов.
- Не обязательно подходит для универсальных, многократно используемых библиотек.
- Используйте подпространства имен, чтобы избежать коллизий между вашими проектами.
- Используйте вложенные пространства имен, чтобы избежать коллизий в ваших проектах.
- При именовании глобального идентификатора (то есть глобального пространства имен или макроса) избегайте имен, зарезервированных стандартом POSIX.