Правила (которые не изменились в C ++ 11):
- Зарезервировано в любой области, в том числе для использования в качестве макросов реализации :
- идентификаторы, начинающиеся со знака подчеркивания, за которыми сразу следует заглавная буква
- идентификаторы, содержащие соседние подчеркивания (или «двойное подчеркивание»)
- Зарезервировано в глобальном пространстве имен:
- идентификаторы, начинающиеся с подчеркивания
- Кроме того, все в
std
пространстве имен зарезервировано. (Вы можете добавить шаблонные специализации, хотя.)
Из стандарта C ++ 2003 года:
17.4.3.1.2 Глобальные имена [lib.global.names]
Определенные наборы имен и сигнатур функций всегда зарезервированы для реализации:
- Каждое имя, которое содержит двойное подчеркивание (
__
) или начинается с подчеркивания, за которым следует заглавная буква (2.11), зарезервировано для реализации для любого использования.
- Каждое имя, которое начинается со знака подчеркивания, зарезервировано для реализации для использования в качестве имени в глобальном пространстве имен. 165
165) Такие имена также зарезервированы в пространстве имен ::std
(17.4.3.1).
Поскольку C ++ основан на стандарте C (1.1 / 2, C ++ 03), а C99 является нормативным справочным документом (1.2 / 1, C ++ 03), они также применяются в стандарте C 1999 года:
7.1.3 Зарезервированные идентификаторы
Каждый заголовок объявляет или определяет все идентификаторы, перечисленные в связанном с ним подпункте, и, необязательно, объявляет или определяет идентификаторы, перечисленные в соответствующем подпункте будущих направлений библиотеки, и идентификаторы, которые всегда зарезервированы либо для любого использования, либо для использования в качестве идентификаторов области файла.
- Все идентификаторы, которые начинаются со знака подчеркивания, а также заглавной буквы или другого подчеркивания, всегда зарезервированы для любого использования.
- Все идентификаторы, которые начинаются с подчеркивания, всегда зарезервированы для использования в качестве идентификаторов с областью действия файла как в обычном пространстве, так и в пространстве имен тега.
- Каждое имя макроса в любом из следующих подпунктов (включая будущие направления библиотеки) зарезервировано для использования, как указано, если включен какой-либо из связанных с ним заголовков; если прямо не указано иное (см. 7.1.4).
- Все идентификаторы с внешней связью в любом из следующих подпунктов (включая будущие направления библиотеки) всегда зарезервированы для использования в качестве идентификаторов с внешней связью. 154
- Каждый идентификатор с областью файла, указанной в любом из следующих подпунктов (включая будущие направления библиотеки), зарезервирован для использования в качестве имени макроса и в качестве идентификатора с областью файла в том же пространстве имен, если включен какой-либо из связанных с ним заголовков.
Другие идентификаторы не зарезервированы. Если программа объявляет или определяет идентификатор в контексте, в котором он зарезервирован (кроме как разрешено в 7.1.4), или определяет зарезервированный идентификатор как имя макроса, поведение не определено.
Если программа удаляет (с #undef
) любое макроопределение идентификатора в первой группе, указанной выше, поведение не определено.
154) Перечень зарезервированных идентификаторов с внешней связью включает в себя errno
, math_errhandling
, setjmp
, и va_end
.
Другие ограничения могут применяться. Например, стандарт POSIX резервирует множество идентификаторов, которые могут отображаться в обычном коде:
- Имена, начинающиеся с
E
заглавной буквы после цифры или заглавной буквы:
- может использоваться для дополнительных имен кодов ошибок.
- Имена , которые начинаются либо с
is
или to
следуют буквы нижнего регистра
- может использоваться для дополнительного тестирования символов и функций преобразования.
- Имена, начинающиеся с
LC_
заглавной буквы
- может использоваться для дополнительных макросов, определяющих атрибуты локали.
- Имена всех существующих математических функций с суффиксом
f
или l
зарезервированы
- для соответствующих функций, которые работают с аргументами типа float и long double, соответственно.
- Имена, начинающиеся с
SIG
заглавной буквы, зарезервированы
- для дополнительных имен сигналов.
- Имена, начинающиеся с
SIG_
заглавной буквы, зарезервированы
- для дополнительных сигнальных действий.
- Имена , начинающиеся с
str
, mem
или с wcs
последующим строчной буквой защищены
- для дополнительных строковых и массивных функций.
- Имена, начинающиеся с
PRI
или SCN
сопровождаемые любой строчной буквой или X
зарезервированные
- для дополнительных макросов спецификатора формата
- Имена, заканчивающиеся на
_t
, зарезервированы
- для дополнительных имен типов.
Хотя использование этих имен в ваших собственных целях в настоящее время может не вызывать проблем, они повышают вероятность конфликта с будущими версиями этого стандарта.
Лично я просто не начинаю идентификаторы с подчеркивания. Новое дополнение к моему правилу: нигде не используйте двойные подчеркивания, что легко, поскольку я редко использую подчеркивание.
После исследования этой статьи я больше не заканчиваю свои идентификаторы, _t
поскольку это зарезервировано стандартом POSIX.
Правило о том, что любой идентификатор заканчивается на _t
меня, очень удивило. Я думаю, что это стандарт POSIX (пока не уверен), требующий разъяснений, а также официальных главы и стиха. Это из руководства по GNU libtool , в котором перечислены зарезервированные имена.
CesarB предоставил следующую ссылку на зарезервированные символы POSIX 2004 и отмечает, что «там можно найти много других зарезервированных префиксов и суффиксов ...». В
POSIX 2008 зарезервированные символы определяются здесь. Ограничения несколько более нюансированы, чем указанные выше.