Согласно C++11 17.6.4.3.2 Global names
(хотя это ограничение было вокруг на некоторое время):
Некоторые наборы имен и сигнатуры функций всегда зарезервировано для осуществления:
- Каждое имя, которое содержит двойное подчеркивание _ _ или начинается с подчеркивания, за которым следует заглавная буква, зарезервирована для реализации для любого использования.
- Каждое имя, которое начинается с символа подчеркивания, зарезервировано для реализации для использования в качестве имени в глобальном пространстве имен.
Таким образом, вы действительно должны использовать ни, если вы хотите, чтобы ваше программное обеспечение, чтобы быть портативными, хотя, сказав, что много людей сделать использовать оба сорта.
Было бы «безопаснее» использовать что-то наподобие GUARD_X_H
или X_H_INCLUDED
, хотя, конечно, вам все равно нужно опасаться столкновений. Вы могли бы взять на себя путь Java и в конечном итоге с помощью макросов, таких как:
AU_COM_POWERFIELD_DATASTRUCTURES_TREES_BALANCED_BTREE_H
до тех пор, пока вы остаетесь ниже пределов осуществления для имен макросов (которые, по памяти, по крайней мере, 1024 символов).
В качестве альтернативы, если вы хотите пожертвовать портативность (но не много портативности, так как она поддерживается в очень многих компиляторах), вы можете посмотреть в #pragma once
, где вам не придется беспокоиться о придумывать уникальные имена.
двойные подчеркивания зарезервированы для реализации - использование их в ваших собственных файлах заголовков является неопределенным поведением и, как правило, не является хорошей идеей. –
Также проверьте '#pragma once' http://stackoverflow.com/questions/1143936/pragma-once-vs-include-guards – Anthony
Это [похоже] (http://stackoverflow.com/a/33005607/4143855), не имея ведущих подчеркиваний, было бы лучше. Почему бы не просто «X_H_INCLUDED»? – Tas