ПРИМЕЧАНИЕ. Это вопрос c, хотя я добавил c++, если какой-либо эксперт C++ может дать обоснование или историческую причину, по которой C++ использует другую формулировку, чем C.
В стандартной спецификации библиотеки C мы имеем этот нормативный текст, C17 7.1.3 Зарезервированные идентификаторы (выделение мое):
- Все идентификаторы, начинающиеся с символа подчеркивания, и буква верхнего регистра или другой символ подчеркивания , всегда зарезервированы для любого использования.
- Все идентификаторы, начинающиеся с символа подчеркивания, всегда зарезервированы для использования в качестве идентификаторов с областью файлов как в обычном, так и в пространстве имен тегов.
Теперь я продолжаю читать ответы на SO различными уважаемыми экспертами С, где они утверждают, что для компилятора или стандартной библиотеки это нормально, чтобы использовать идентификаторы с подчеркиванием + прописным или двойным подчеркиванием.
Разве "зарезервировано для любого использования" не зарезервировано для всех, кроме будущих расширений языка C? Это означает, что реализация не позволяет их использовать.
В то время как вторая фраза выше, касающаяся единственного ведущего подчеркивания, похоже, направлена на реализацию?
В целом, стандарт C написан таким образом, что ожидается, что разработчики компилятора/библиотекаторы станут типичным читателем - не столько программистами приложений.
Примечательно, что C++ имеет совершенно другую формулировку:
- Каждое имя, содержащее двойной знак подчеркивания (
__
) или начинающийся с символа подчеркивания, за которым следует заглавная буква (2.11) , зарезервировано для реализации для любого использования.
(См. Каковы правила использования подчеркивания в идентификаторе C++?)
Возможно, это смешение между C и C++, а языки здесь разные?