Я хочу знать точное различие между Заголовочным файлом (как в MyHeader.hpp) и a namespace
в c++
?
Заголовочные файлы являются настоящими файлами - хранятся в файловой системе, на них ссылаются по имени файла, и #include
'd в других файлах (по крайней мере, в C/C++ или других языках, использующих макропрепроцессор M4). В заголовочных файлах обычно группируются части кода, которые являются взаимозависимыми частями одного и того же конкретного элемента. Например, в игре может быть заголовочный файл для всего графического рендеринга.
Пространства имен, с другой стороны, являются элементом языка программирования - они существуют не как объект файловой системы, а скорее как обозначение в коде, сообщающее компилятору, что определенные вещи находятся в данном пространстве имен. Пространства имен обычно группируют интерфейсы (функции, классы/структуры, типы) схожих (но не обязательно взаимозависимых) элементов. Например, пространство имен std
в C++ содержит все функции и классы Стандартной библиотеки.
На обычном человеческом языке заголовочный файл - это уникальный файл в файловой системе, а пространство имен охватывает один или несколько файлов.
Т.е. HeaderFile - это физическая вещь, а пространство имен - логическая вещь.
узнать больше о них можно здесь http://en.wikipedia.org/wiki/Namespace и http://en.wikipedia.org/wiki/Header_file
Заголовочный файл - это файл, который предназначен для включения в исходные файлы. Обычно они содержат объявления определенных классов и функций.
Пространство имен позволяет коду классифицировать идентификаторы. То есть классы, функции и т. Д. Могут быть помещены в пространство имен, сохраняя их отдельно от других классов, которые не связаны между собой. Например, в C ++ все из стандартной библиотеки находится в пространстве имен std
.
Чтобы узнать, что такое заголовочный файл, вам нужно знать значение слова «объявление».
Проще говоря, в C / C ++ компиляция выполняется отдельно для каждого источника. Если у меня есть A.cpp и внутри я использую функцию foo (), которая будет определена где-то в другом месте, мне нужно сказать компилятору, что: «Эй, я использую foo (), хотя вы не видите, что она определена где-либо в моем исходном коде, не Не волнуйтесь, это определено в другом источнике ». Они способ сообщить компилятору об этом, "объявив" foo () в A.cpp.
Если я являюсь автором foo (), каждый, кто использует foo (), должен записать объявление void foo (); в исходном файле. Будет много дублированной и бессмысленной работы. И мне так сложно сказать парню, что он "использует" foo (), чтобы иметь правильное объявление. Поэтому как автор foo () я записываю файл, содержащий объявление для использования foo (), и распространяю его так, чтобы люди могли просто «импортировать» содержимое файла в свой источник. Я распространяю файл заголовка. Действие импорта - #include в C / C ++. Да, #include - это не что иное, как вставка содержимого включенного файла в место #include.
Пространство имен - это отдельная история. Короче говоря, вы можете думать, что это «настоящее» имя функции / класса и т. Д., Например, если я сделаю
namespace FOO {
class Bar { }
}
Класс на самом деле не называется Bar, его «настоящее» имя на самом деле FOO :: Bar .
В C ++ есть способ избавить вас от ввода длинного настоящего имени с помощью «using».