Подтвердить что ты не робот

С++: использование пространства имен и #include

В С++ какая разница между директивой #include и using namespace? Также вы сохраняете свои пространства имен в виде отдельных файлов и что такое расширение файла для таких файлов?

4b9b3361

Ответ 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.

Пространства имен - это просто способ логически группировать ваш код.

Нет, пространства имен не хранятся в отдельных файлах, и у них нет определенного расширения файла. Если бы у меня был проект с несколькими пространствами имен, я мог бы создать отдельный каталог для каждого пространства имен (а потом, опять же, я не мог бы, это зависело бы от ситуации).

Ответ 2

В С++ #include используется для добавления файлов в ваш проект, в то время как namespace используется для хранения ваших объектов в логических модулях (пространство имен не относится к C)

Например, у вас может быть векторный класс в файле "vector.h", поэтому вы включаете его в свой проект.

вектор является частью большой библиотеки (стандартной библиотеки) STD, поэтому вы можете получить доступ к ней с помощью

std::vector

Однако, поскольку программисты ленивы и не хотят писать std:: повсюду (стандартная библиотека имеет много очень полезных частей), вы можете написать

using namespace std

в верхней части файла. Это скажет компилятору, что каждый раз, когда он видит тип (например, вектор), также проверяет пространство имен std, поскольку определение может быть там. Таким образом, следующие утверждения становятся эквивалентными.

std::vector
vector

В vector.h вы должны увидеть что-то вроде

namespace std
{
   class vector { /* Implementation */ }
}

Итак, #include заключается в добавлении файлов, а using namespace - очищать ваш код и упаковывать его в "значимые" библиотеки. Вы можете опустить using namespace при программировании, но вам абсолютно необходимо #include