Ответ 1
Стандартные заголовки C++ не имеют суффикса ".h". Я полагаю, что причина в том, что было много разных предстандартных реализаций, которые стандарт может нарушить. Поэтому вместо того, чтобы требовать, чтобы поставщики изменили свой существующий заголовок "iostream.h" (например), чтобы он соответствовал стандартам (что нарушило бы их существующий пользовательский код), комитет по стандартам решил, что они удалили суффикс (который, я думаю, нет тогда существующая реализация уже была сделана).
Таким образом, существующие нестандартные программы будут продолжать работать с использованием нестандартных библиотек поставщика. Когда пользователь хотел сделать свои программы совместимыми со стандартами, одним из шагов, которые он предпринял, было изменение директивы " #include
" для удаления суффикса ".h".
Так
#include <iostream> // include the standard library version
#include <iostream.h> // include a vendor specific version (which by
// now might well be the same)
Как уже упоминалось в других ответах, авторы нестандартных библиотек могут выбрать либо соглашение об именовании, но я думаю, что они захотят продолжить использовать ".h" или ".hpp" (как это сделал Boost) по нескольким причинам:
- если & когда библиотека станет стандартизированной, стандартная версия не будет автоматически переопределять предыдущую, нестандартную (по всей вероятности, из-за неправильного пользовательского кода)
- Кажется, существует соглашение (более или менее), что заголовки без суффикса являются стандартными библиотеками, а заголовки без суффикса (кроме старых заголовков C) нестандартны.
Обратите внимание, что аналогичная проблема возникла, когда комитет пошел добавлять хеш-карты в STL - они обнаружили, что уже существует много (разных) реализаций hash_map
, поэтому вместо того, чтобы придумать стандартную, которая ломает много вещей там. сегодня они называют стандартную реализацию " unordered_map
". Предполагалось, что пространства имен помогут предотвратить этот тип прыжков через обручи, но, похоже, он не работает достаточно хорошо (или не используется достаточно), чтобы позволить им использовать более естественное имя, не нарушая много кода.
Обратите внимание, что для заголовков "C" C++ позволяет вам включить вариант <cxxxxxx>
или <xxxxxx.h>
. Тот, который начинается с 'c' и не имеет суффикса ".h", помещает свои объявления в пространство имен std
(и, возможно, глобальное пространство имен), а те, которые имеют суффикс ".h", помещают имена в глобальное пространство имен (некоторые компиляторы). также поместите имена в пространство имен std
- мне неясно, соответствует ли этот стандарт, хотя я не вижу вреда).