Другие языки программирования и технологии

Изучаю си++ обьясните заголовок... #ifndef _PROJECT_H_ #define _PROJECT_H_ Это что создает файлы?

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

#include "second file"
#include "third file"
int main(){тут в принципе реализация программы}

но #include "second file" замениться на:

#include "third file"
int func(){} //функция которую хотели использовать в первом файле...

и выглядеть будет вот так:

#include "third file"
int func(){} //функция во втором файле, которую хотели использовать в первом файле...
#include "third file"
int main(){тут в принципе реализация программы}

А потом еще и третий файл добавиться в первый. Но уже видно что третьих файла подключается два в первом потому что он был еще и во втором... Если в третьем будет какая то функция то такой подход вызовет ошибку. Две одинаковые функции и какую сейчас вызывать непонятно...

В таком случае используют конструкцию #ifndef #define #endif

#ifndef THIRD_FILE //обозначает если переменная THIRD_FILE не объявлена
#define THIRD_FILE //объявить такую переменную THIRD_FILE

тут тело самой библиотеки

#endif //говорит что #ifndef распространяется до этого места

Как же это работает. В первой строке проверяется объявлена ли переменная. Если нет, то значит библиотека еще не была подключена и выполняется все что находится от #ifndef до #endif. При первом выполнении у нас объявляется переменная с этим именем и при повторном включении библиотеки #ifndef поймет что такая переменная существует и пропустит (сделает как будто там ничего не было) от #ifndef до #endif. Таким образом проблем с множественным подключением одного файла можно избежать...
АМ
Александр Мысливый
15 398
Лучший ответ
Вадим Савинкин Спасибо за подробный ответ, но всеровно я не совсем представляю что и как... как вообще называется эта тема?
можно заменить на #pragma once
Александр Мысливый Вот уж эти визуал студио... А эта прагма в других компиляторах поддерживается!? Вообще у каждого компилятора свои наборы прагм, поэтому для совместимости их советуют не использовать вообще!
Это блокировка от повторного использования файла.