Стандартные заголовки C ++ не имеют суффикса ".h". Я полагаю, что причина в том, что было много разных предстандартных реализаций, которые стандарт может нарушить. Поэтому вместо того, чтобы требовать, чтобы поставщики изменили свой существующий заголовок «iostream.h» (например), чтобы он соответствовал стандартам (что нарушило бы их существующий код пользователя), комитет по стандартам решил, что они удалили суффикс (который, я думаю, нет тогда существующая реализация уже была сделана).
Таким образом, существующие нестандартные программы будут продолжать работать с использованием нестандартных библиотек поставщика. Когда пользователь хотел сделать свои программы совместимыми со стандартами, одним из шагов, которые он предпринял, было изменение директивы "#include
", чтобы удалить суффикс ".h".
So
#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
- мне неясно, соответствует ли это стандарту, хотя я не вижу вреда).