Я играю с gmock и заметил, что он содержит эту строку:
#include <tuple>
Я ожидал tuple.h.
Когда можно исключить расширение и придает ли это директиве другое значение?





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