2016-11-16 5 views
-2

Я использую проект с открытым исходным кодом (Open Scene Graph). Я обнаружил, что все имена файлов заголовков находятся в формате File, который я нашел Файл без расширения, как упоминалось на сайте.Файлы заголовков C++ без расширения

Я хотел бы знать, почему разработчик использовал это расширение, а не традиционное расширение файла .h.

+0

Возможный дубликат [Разница между iostream и iostream.h] (http: // stackoverflow.com/вопросы/2976477/разница между-iostream-and-iostream-h) –

ответ

4

Кажется, вы говорите о this repository кода C++.

Похоже, авторы этого кода решили следовать шаблонам стандартной библиотеки C++. В стандартном C++ заголовки библиотек не должны иметь расширение .h. Таким образом, следующее является правильным:

#include <iostream> 

В большинстве реализаций пишущих <iostream.h> также будет работать, но версия без расширения на самом деле правильно. Стандартная библиотека C++ смогла отбросить расширения в C++ 98 из-за внедрения пространств имен и введения пространства имен std для стандартной библиотеки.

Стандарт C++ не требует и не запрещает расширение для других заголовков, поэтому авторам какого-либо программного обеспечения зависит любое расширение файла, если оно есть. Наиболее распространенные варианты - использовать .h или .hpp, причем последний предназначен для того, чтобы отличать заголовки C++ от заголовков C.

Быстрый взгляд на код OpenSceneGraph показывает, что они следовали стандартным библиотечным шаблонам C++ в их включении. Нет расширений, и все находится в пространстве имен osg, аналогичном пространству имен std стандартной библиотеки. Поэтому использование библиотек OpenSceneGraph очень похоже на использование стандартной библиотеки C++.

#include <osg/Camera> // Provides osg::Camera 

Это та же картина, как:

#include <string> //Provides std::string 

Так что я думаю, что можно с уверенностью сказать, что авторы OSG хотел следовать той же схеме, как и в стандартной библиотеке C++. Мое личное мнение состоит в том, что лучше иметь расширение файла, даже если бы можно было искать файлы заголовков.

+0

фактически в большинстве современных реализаций не поддерживают '' кроме MSVC. Попробуйте это в других компиляторах, и вы получите некоторую ошибку. –

+1

Пространства имен не имеют ничего общего с именами заголовков. –

+0

@PeteBecker Конечно, не напрямую, но не было ли перемещение в файлы без расширения, сделанные при появлении пространств имен на C++ 98? С некоторыми реализациями в то время, когда поддерживались версии '.h', которые отображали символы за пределами пространств имен, например' iostream.h', давая глобальный 'cout' вместо' std :: cout'. – DUman

-1

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

Обратите внимание, что эти некоторые заголовки могут иметь одно и то же имя, но могут или не быть похожими в функциональности, которую они предлагают.

#include<some.h> //this includes the header C library 
#include<some> //this includes the header from the C++ standard library 
+0

неправильный. В C++ для включения стандартных библиотек C используйте 'c ', например '', '' –

+0

@ LưuVĩnhPhúc Это неверно. cstdio - эквивалент C++ библиотеки C, и это НЕ то же самое, что и в стандартной библиотеке C. Вот еще один вопрос, и наиболее подходящий ответ, похоже, согласуется с моим ответом: http://stackoverflow.com/questions/7673597/include-string-or-string-h –

+0

well ['stdio.h' устарел долго] (http://stackoverflow.com/a/7596439/995714) и может просто привести вас в проблему с пространством имен. http://stackoverflow.com/q/37904753/995714 –

0

Я отправил письмо одному из разработчиков (Robert Osfield) OpenSceneGraph. Вот его ответ.

OSG принял тот же заголовок, что и стандартные заголовки C++. Мы добавили a - -C++ - - строка в заголовки, чтобы редакторы могли использовать это, чтобы определить тип.

Смежные вопросы