Правила (которые не изменились в 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 здесь определены зарезервированные символы. Ограничения несколько более тонкие, чем указанные выше.