включить охранников в C ++
При программировании на 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 , другими словами, он не обрабатывает файл.