Я играю с gmock и заметил, что он содержит эту строку:
#include <tuple>
Я ожидал tuple.h
.
Когда можно исключить расширение и придает ли это директиве другое значение?
Я играю с gmock и заметил, что он содержит эту строку:
#include <tuple>
Я ожидал tuple.h
.
Когда можно исключить расширение и придает ли это директиве другое значение?
Стандартные заголовки 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) по нескольким причинам:
Обратите внимание, что аналогичная проблема возникла, когда комитет начал добавлять хеш-карты в STL — они обнаружили, что уже существует много (разных) hash_map
реализаций, поэтому вместо того, чтобы придумать стандартную, которая ломает много чего там сегодня они называют стандартную реализацию "unordered_map
". Пространства имен должны были помочь предотвратить этот тип прыжков через обручи, но, похоже, они не работали достаточно хорошо (или не использовались достаточно хорошо), чтобы позволить им использовать более естественное имя, не нарушая большого количества кода.
Обратите внимание, что для заголовков 'C' C++ позволяет включать вариант <cxxxxxx>
или <xxxxxx.h>
. Тот, который начинается с «c» и не имеет суффикса «.h», помещает свои объявления в пространство имен std
(и, возможно, глобальное пространство имен), те, у которых есть суффикс «.h», помещают имена в глобальное пространство имен (некоторые компиляторы также поместите имена в пространство имен std
- мне неясно, соответствует ли это стандарту, хотя я не вижу вреда).
using namespace std;
в своих исходных файлах, и, к сожалению (поскольку в C++ обратная совместимость является королем) Комитет решил, что это оправдывает использование другого имени.
- person Tyg13; 27.03.2019
Если файл называется tuple
, вам нужно #include <tuple>
, если он называется tuple.h
, вам нужно #include <tuple.h>
Это так просто. Вы не пропускаете ни одно расширение.
Он включает в себя файл с простым названием «кортеж» — у самого файла нет расширения.
Предполагаемый стандарт для включаемых файлов C++ состоит в том, чтобы называть их без расширения .h; многие разработчики библиотек следуют этому стандарту (STL и т. д.), но некоторые — нет.
Ничего особенного не происходит. Файл называется просто tuple
.
Причина этого... в том, что заголовки стандартных библиотек не имеют расширения файла, из-за namespace
s.
Пространства имен были добавлены в стандарт C++ в конце игры со стандартом C++98, включая пространство имен std
, в котором находятся все объекты стандартной библиотеки.
Когда стандартная библиотека была перенесена в пространство имен std
, это означало, что весь существующий код C++ сломался, поскольку все ожидали, что библиотека будет находиться в глобальном пространстве имен. Решение состояло в том, чтобы оставить старые файлы заголовков «dot-h» в покое и предоставить библиотеку с пространством имен в файлах, не имеющих расширения.
Таким образом, старый код, который #include<iosteam.h>
мог бы ожидать глобального cout
, в то время как новый код мог бы #include<iostream>
и ожидать std::cout
.
Насколько я понимаю, #include tuple будет «указывать» на tuple.h.
Проверьте это: iostream vs iostream.h
В дополнение к уже опубликованным прекрасным ответам следует отметить, что стандарт C++ не требует директивы «#include <iostream>
» для чтения файла с именем «iostream» или даже «iostream.h». Его можно было бы назвать «пушистиком». Или может не существовать соответствующего файла, а определения будут встроены в компилятор и активированы директивой include.
Близкие,
Я думаю, что дело в следующем: #include ‹lib› всегда предшествует /lib/include к пути поиска (.h подразумевается), тогда как #include ‹lib.h› ищет только -I‹pathname ›.
Обратите внимание, что я могу ошибаться... Просто я думаю, что это работает (в Forte cc на Solaris).