Правила (які не змінювалися в 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
зарезервовані
- для відповідних функцій, що працюють на плаваючі та довгі подвійні аргументи відповідно.
- Імена, які починаються з
SIG
великої літери, зарезервовані
- для додаткових імен сигналу.
- Імена, які починаються з
SIG_
великої літери, зарезервовані
- для додаткових сигнальних дій.
- Імена , що починаються з
str
, mem
або з wcs
подальшим рядкової буквою захищені
- для додаткових функцій рядків і масивів.
- Імена, що починаються з
PRI
або SCN
слідують за будь-якою малою літерою, або X
зарезервовані
- для додаткових макросів специфікатора формату
- Імена, які закінчуються
_t
, зарезервовані
- для додаткових імен типів
Хоча використання цих імен для власних цілей зараз може не спричинити проблем, вони створюють можливість конфлікту з майбутніми версіями цього стандарту.
Особисто я просто не запускаю ідентифікатори з підкресленнями. Нове доповнення до мого правила: ніколи не використовуйте подвійні підкреслення, що легко, оскільки я рідко використовую підкреслення.
Після дослідження цієї статті я більше не закінчую свої ідентифікатори, _t
оскільки це зарезервовано стандартом POSIX.
Правило про будь-який ідентифікатор, що закінчується, _t
мене дуже здивувало. Я думаю, що це стандарт POSIX (ще не впевнений), який шукає роз'яснення та офіційний розділ та вірш. Це в посібнику з лібтуалу GNU , в якому перераховані зарезервовані імена.
CesarB надав наступне посилання на зарезервовані символи POSIX 2004 та ", що багато інших зарезервованих префіксів та суфіксів ... можна знайти там". Тут
визначені зарезервовані символи POSIX 2008 . Обмеження дещо більш нюансовані, ніж вище.