включить охранников в C ++

Опубликовано: 29 Декабря, 2021

При программировании на C ++ мы часто используем класс несколько раз, и, следовательно, требуется создать файл заголовка и просто включить его в основную программу. Теперь иногда бывает, что определенный файл заголовка прямо или косвенно включается несколько раз, тогда класс, объявленный в файле заголовка, повторно объявляется, что дает ошибку. Чтобы понять потребности включенных охранников, давайте сначала разберемся с одним примером:

Программа 1: Создание класса Animal и сохранение его как « Animal.h» . Ниже представлена программа для того же:

C ++

// C++ program to create a header
// file named as "Animal.h"
#include <iostream>
#include <string>
using namespace std;
// Animal Class
class Animal {
string name, color, type;
public :
// Function to take input
void input()
{
name = "Dog" ;
color = "White" ;
}
// Function to display the member
// variables
void display()
{
cout << name << " is of "
<< color << endl;
}
};

Программа 2: Создание класса Dog и сохранение его как Dog.h. Не забудьте включить файл заголовка «Animal.h», объявленный выше:

C ++

// C++ program to create header file
// named as Dog.h
// Include the header file "Animal.h"
#include "Animal.h"
// Dog Class
class Dog {
Animal d;
public :
// Take input to member variable
// using function call in another
// header file
void dog_input() { d.input(); }
// Function to display the member
// variable using function call
// in another header file
void dog_display() { d.display(); }
};

Программа 3: Создайте файл main.cpp и включите оба заголовочных файла выше. Ниже представлена программа для того же:

C ++

// C++ program to illustrate the
// include guards
#include "Animal.h"
#include "Dog.h"
#include <iostream>
using namespace std;
// Driver Code
int main()
{
// Object of Dog class in
// "Dog.h" header file
Dog a;
// Member Function Call
a.dog_input();
a.dog_display();
return 0;
}

Вывод: Теперь, когда выполняется вышеуказанная программа «main.cpp», возникает следующая ошибка:

Объяснение: Когда программа «main.cpp» составлена с использованием включает Animal.h и определяет класс животных, после этого в то время как в том числе Dog.h, Animal.h получить включен и в основной программе есть два определения класса животных, поэтому эта ошибка сгенерировано. Теперь давайте решим проблему с помощью включенных охранников .

In the C and C++ programming languages, an #include guard, sometimes called a macro guard, header guard, or file guard, is a particular construct used to avoid the problem of double inclusion when dealing with the include directive.

Решение:
Включить защиту гарантирует, что компилятор обработает этот файл только один раз, независимо от того, сколько раз он был включен. Защитники включения - это просто серия директив препроцессора, которая гарантирует, что файл будет включен только один раз.
Используемые препроцессоры:

  • #ifndef: если не определено, определяет, не существует ли предоставленных макросов.
  • #define: определяет макросы.
  • #endif: закрывает директиву #ifndef.

Блок операторов между #ifndef и #endif будет выполнен, только если макрос или идентификатор с #ifndef не определен.

Синтаксис:

 #ifndef ANIMAL (любое слово, которое вам нравится, но уникальное для программы)
#define ANIMAL (то же слово, что использовалось ранее)

class Animal {
    // Код
};

#endif

Итак, заголовочный файл «Animal.h» должен быть объявлен как:

C ++

// Checks if _ANIMALS IF DECLARED
#ifndef _ANIMALS_
// Defines _ANIMALS_ if above
// conditions fails
#define _ANIMALS_
#include <iostream>
#include <string>
using namespace std;
// Animal Class
class Animal {
string name, color, type;
public :
// Function to take input to
// member variable
void input()
{
name = "Dog" ;
color = "White" ;
}
// Function to display the
// member variable
void display()
{
cout << name << " is of"
<< color << endl;
}
};
#endif // _ANIMALS_

Выход:

Объяснение: При запуске main.cpp включается Animal.h и объявляется класс животных. Здесь первая строка заголовка Animal.h при выполнении и поскольку _ANIMALS_ не определен, код выполняется нормально. Когда включается файл заголовка Dog.h, который, в свою очередь, включает Animal.h , на этот раз _ANIMALS_ определяется в программе, поэтому условие #ifndef первой строки истинно, и весь код ПРОПУСКАЕТСЯ до последней строки, то есть #endif . Проще говоря, если препроцессору определено это имя, он пропускает весь файл и переходит к #endif , другими словами, он не обрабатывает файл.

Хотите узнать о лучших видео и практических задачах, ознакомьтесь с базовым курсом C ++ для базового и продвинутого уровня C ++ и курсом C ++ STL для базового уровня плюс STL. Чтобы завершить подготовку от изучения языка к DS Algo и многому другому, см. Полный курс подготовки к собеседованию .
C++