Когда вы можете опустить расширение файла в директиве #include?

Я играю с gmock и заметил, что он содержит эту строку:

#include  

Я бы ожидал tuple.h .

Когда можно исключить расширение, и это дает директиве другое значение?

У стандартных заголовков C ++ нет суффикса «.h». Я считаю, что причина в том, что существует множество различных стандартных реализаций, которые стандарт разорвал бы. Поэтому вместо того, чтобы требовать, чтобы производители меняли свой заголовок «iostream.h» (например), чтобы соответствовать стандартам (что нарушило бы их существующий код пользователя), комитет по стандартам решил, что они сбросят суффикс (который, я считаю, то существующая реализация уже была выполнена).

Таким образом, существующие, нестандартные программы будут продолжать работать с использованием нестандартных библиотек поставщика. Когда пользователь хотел сделать стандарты своих программ совместимыми, одним из шагов, которые они предпримут, является изменение директивы « #include », чтобы удалить суффикс «.h».

Так

 #include  // include the standard library version #include  // include a vendor specific version (which by // now might well be the same) 

Как упоминалось в других ответах, авторы нестандартных библиотек могут выбирать либо соглашение об именах, но я думаю, что они захотят продолжить использовать «.h» или «.hpp» (как это сделал Boost) по нескольким причинам:

  1. если &, когда библиотека получает стандартизацию, стандартная версия не будет автоматически переопределять предыдущую, нестандартную (что приведет к поломке кода пользователя по всей вероятности)
  2. это похоже на соглашение (более или менее), что заголовки без суффикса являются стандартными библиотеками, а те, у которых есть суффикс (кроме старых заголовков C), являются нестандартными.

Обратите внимание, что подобная проблема возникла, когда комитет пошел добавлять hash-карты в STL – они обнаружили, что существует уже много (разных) реализаций hash_map которые существуют, поэтому вместо того, чтобы придумать стандартный, который разбивает много материала там сегодня они называют стандартную реализацию « unordered_map ». Пространства имен должны были помочь предотвратить этот тип прыжков через обручи, но он, похоже, не работал достаточно хорошо (или использовался достаточно хорошо), чтобы позволить им использовать более естественное имя, не нарушая много кода.

Обратите внимание, что для заголовков «C» C ++ позволяет включить либо либо . Тот, который начинается с «c» и не имеет суффикса «.h», помещает свои объявления в пространство имен std (и, возможно, глобальное пространство имен), те, у которых суффикс «.h» помещает имена в глобальное пространство имен (некоторые компиляторы также поместите имена в пространство имен std – мне непонятно, совместимы ли эти стандарты, хотя я не вижу вреда).

Если файл называется tuple вам нужно #include если он называется tuple.h тогда вам нужно #include

Это так просто. Вы не пропускаете расширение.

Он включает файл, который просто называется «tuple» – сам файл не имеет расширения.

Предполагаемый стандарт для файлов C ++ include – это их имя без расширения .h; многие авторы библиотек следуют этому стандарту (STL и т. д.), но некоторые нет.

Нет ничего особенного. Файл просто называется tuple .

Причина этого … что стандартные заголовки библиотек не имеют расширения файла из-за namespace s.

Пространства имен были добавлены к стандарту C ++ в конце игры со стандартом C ++ 98, включая пространство имен std котором находятся все объекты стандартной библиотеки.

Когда стандартная библиотека переместилась в пространство имен std , это означало, что весь существующий код на C ++ сломается, поскольку все это ожидало, что библиотека будет в глобальном пространстве имен. Решение заключалось в том, чтобы оставить старые файлы заголовков «dot-h» в покое и предоставить библиотеку с именами в файлах, которые не имеют расширения.

Таким образом, старый код, который будет #include мог ожидать глобального cout то время как новый код мог бы #include и ожидать std::cout .

Я понял, что #include tuple будет «указывать» на tuple.h.

Проверьте это: iostream vs iostream.h

В дополнение к тонким ответам, уже опубликованным, следует отметить, что для стандарта C ++ не требуется директива «#include » для чтения файла с именем «iostream» или даже «iostream.h». Его можно назвать «fuzzball». Или, не может существовать соответствующий файл, и определения должны быть встроены в компилятор и активированы директивой include.

Folks,

Я считаю, что сделка: #include allways pre pends / lib / include к пути поиска (.h – infrerred), тогда как #include выполняет поиск только -I .

Обратите внимание, что я мог ошибаться … Я просто думаю, что это работает (в Forte cc на Solaris).

  • Почему стандартные iteratorы диапазона вместо ?
  • Это неуказанное поведение для сравнения указателей с разными массивами для равенства?
  • Существуют ли машины, где sizeof (char)! = 1 или, по крайней мере, CHAR_BIT> 8?
  • Является ли `long` гарантией быть как минимум 32 бит?
  • Пространства в URL-адресах?
  • Используйте CSS для автоматического добавления звездочки «обязательное поле» для формирования входных данных
  • Подготовка к std :: iterator Будучи устаревшим
  • Нет ли скобок в конструкторе без аргументов в качестве языка?
  • Эффекты ключевого слова extern для функций C
  • Список стандартных длин для полей базы данных
  • Имеет ли printf ("% x", 1) неопределенное поведение?
  • Давайте будем гением компьютера.