Все остальные рассмотрели правильное включение макросов include guard.
File.h
#ifndef FILE_H
#define FILE_H
// Code here
#endif
Но все остальные пропустили вторую часть вашего вопроса о правильном использовании:
Это пример неправильного использования:
#ifndef FILE_H
#include "file.h"
#endif
#ifndef SECOND_H
#define SECOND_H
class second
{
//do routine
};
#endif
Это неверно (хотя оно может быть слишком сильным).
Защитные ограждения в каждом файле должны окружать весь их контент.Итак, во втором файле #include "file.h"
должен быть внутри включенных защит.
Также вам не нужно проверять включение, которое будет сделано внутри самого файла.Таким образом, файл должен выглядеть следующим образом:
#ifndef SECOND_H
#define SECOND_H
#include "file.h"
class second
{
//do routine
};
#endif
Также ваши макросохранители слишком малы.Существует высокая вероятность того, что они будут использованы кем-то другим;это приведет к всевозможным странным столкновениям.
Хороший способ сделать охранников уникальными - это использовать префикс, ваше полное имя (или псевдоним), или, если у вас есть собственный зарегистрированный веб-сайт, тогда используется его домен.название.Затем я также добавляю часть иерархии каталогов, в которую входит файл.
#ifndef WEBSITE1_NAMESPACE1_NAMESPACE2_FILENAME_H
#define WEBSITE1_NAMESPACE1_NAMESPACE2_FILENAME_H
#endif
Другой альтернативой (особенно если вы работаете в Windows) является генерация GUID.Просто создайте новый файл для каждого файла.
Конечный момент: включайте другие файлы из заголовочных файлов только в том случае, если их содержание абсолютно необходимо.Вам нужно только включить «file.h», если этот файл имеет определение типа, от которого зависит секунда класса.Если ваш класс использует этот класс только в качестве указателя или ссылки, то предпочтительнее использовать предварительное объявление, а не заголовочный файл.
Сценарии, в которых вы должны #include
:
- second - дочерний элемент first.
- second имеет первый (-ые) элемент (-ы)
objects
- second имеет метод (ы), которые принимают first
objects
в качестве параметров - Second имеет метод (ы), которые возвращают первый
objects
в результате
Обратите внимание, что я использую термин "объекты".Если они являются ссылками или указателями, то это не считается.В этих случаях вы можете использовать предварительное объявление для решения проблемы.