Ответ 1
Чтобы ответить на ваш вопрос, я немного вернусь и возьму некоторые основы C и С++.
При компиляции C/С++ компиляция исходных файлов в фактический исполняемый файл на самом деле состоит из двух шагов, компиляции и компоновки. На этапе компиляции выполняется один файл .cpp и компилируется. Содержимое других .cpp файлов не отображается компилятору. Это генерирует "объектный файл" (я не знаю, почему он так назвал). Все объектные файлы затем связаны компоновщиком для создания окончательного исполняемого файла.
Это приводит к двум важным понятиям в С++, объявлениям и определениям. Объявление указывает, что что-то (переменная или функция) будет где-то существовать. Ниже приведена декларация функции Foo()
void Foo();
Это означает, что мы сказали компилятору, что где-то будет функция Foo(), которая не принимает аргументов и не возвращает никакого значения.
Определено, какая функция на самом деле. Здесь функция определена
void Foo() { cout << "Foo!!"; }
Позволяет определить другую функцию, Bar()
void Bar() {
Foo();
cout << "bar";
}
Эта функция вызывает функцию Foo(). Эта функция не может быть скомпилирована, если функция foo еще не была объявлена или определена ранее в том же файле. Таким образом, декларация сама по себе не производит скомпилированный код. Они просто должны быть там.
Если функция Foo() не определена в этом файле, а другой .cpp файл, то это задача компоновщика, чтобы установить связь между этими двумя функциями. Если функция Foo() не определена нигде, вы получите ошибку компоновщика, а не ошибку компилятора.
Это относится к концепции файлов заголовков. Заголовочные файлы - это место, где вы храните свои объявления. При использовании #include для включения содержимого заголовочного файла то, что на самом деле происходит, заключается в том, что препроцессор (шаг, который выполняется перед фактическим компилятором) загружает включенный файл и "вставляет" содержимое в исходный исходный файл. Таким образом, компилятор увидит файл так, как будто весь файл заголовка на самом деле был вставлен в файл С++.
Поэтому, когда вы программируете на С++, вы обычно помещаете свои определения в файлы .cpp, и вы разместите свои объявления в файлах .h.
Пространства имен - это просто способ логически группировать ваш код.
Нет, пространства имен не хранятся в отдельных файлах, и у них нет определенного расширения файла. Если бы у меня был проект с несколькими пространствами имен, я мог бы создать отдельный каталог для каждого пространства имен (а потом, опять же, я не мог бы, это зависело бы от ситуации).