Header Guard в C ++
Header Guards в C ++ - это директивы условной компиляции, которые помогают избежать ошибок, которые возникают, когда одна и та же функция или переменная определяется более одного раза по ошибке программиста. Согласно C ++, когда функция или переменная определяется более одного раза, возникает ошибка. Ниже приведена программа, иллюстрирующая то же самое:
Программа 1:
C ++
// C++ program to illustrate error // caused due to defining same // function more than once #include <iostream> using namespace std; // Function 1 void fool() { cout << "hello" ; } // Function 2 void fool() { cout << "hello maddy" ; } // Driver Code int main() { // Function Call fool(); return 0; } |
Выход:
Объяснение:
В приведенной выше программе функция fool () была определена дважды, что вызывает фатальную ошибку.
Программа 2:
C ++
// C++ program to illustrate error // caused due to defining same // variable more than once #include <iostream> using namespace std; // Driver Code int main() { // error: note: 'double x' previously double x{}; // declared here int x{ 2 }; return 0; } |
Выход:
Объяснение:
В приведенной выше программе переменная x была определена дважды, что вызывает фатальную ошибку.
Это наиболее часто встречающиеся ошибки, которые можно исправить, имея очень базовые знания программирования. Но если возникает ситуация, когда файл заголовка включается в программу и непреднамеренно выполняется предварительное объявление функции, которая была частью уже включенного файла заголовка. В этом случае содержимое файла заголовка не запоминается, независимо от того, определено ли оно пользователем или предопределено.
В дальнейшем возникает фатальная ошибка, которая иногда становится неразрешимой. Для этого в C ++ есть некоторые директивы препроцессора, которые позволяют избежать этой ошибки.
- Пусть есть файл заголовка с именем pentagon.h, как показано ниже:
C++
// Function to get the side of // the pentagon int getting_pentagon_side() { // Return the side return 5; } |
- Пусть есть еще один файл заголовка с именем «Mathematics.h», который включает файл заголовка «pentagon.h» .
C++
// Including another header file // "pentagon.h" in the current program #include "pentagon.h" |
- Теперь создается программа на C ++ с именем «pentagon.cpp», как показано ниже:
Программа 3:
C ++
// C++ program to illustrate the error // discussed above #include <iostream> // Include header files created #include "mathematics.h" #include "pentagon.h" using namespace std; // Driver Code int main() { return 0; } |
Выход:
Чтобы устранить ошибку, вызванную выше, идея состоит в том, чтобы использовать концепцию «Header Guard», чтобы избежать ошибок, которые возникают, когда одна и та же функциональная переменная определяется более одного раза по ошибке программиста.
Защитник заголовка может избежать таких ошибок с помощью директив условной компиляции. Это комбинация директив условной компиляции, которые защищают ваш заголовок от многократного включения в программу.
Синтаксис:
#ifndef HEADER_H _NAME #define HEADER_H _NAME / * ... ... * / # endif
Теперь давайте вернемся к предыдущему примеру и посмотрим, как можно разрешить конфликт ошибок:
- Во-первых, заголовочный файл «pentagon.h» модифицируется следующим образом:
# ifndef PENTAGON_H #define PENTAGON_H интервал get_pentagon_side () { возврат 5; } #endif
- Теперь файл заголовка «mathematics.h» , который включает в себя «pentagon.h» изменяется следующим образом:
#ifndef MATHEMATICS_H #define MATHEMATICS_H #include "pentagon.h" #endif
Ниже приведена программа после вышеуказанных изменений, чтобы избежать ошибок:
C ++
// C++ program to illustrate how to // avoid errors using Header Guard #include <iostream> // Include header guards in both // the header files #include "mathematics.h" // Now, the error will not occur #include "pentagon.h" using namespace std; // Driver Code int main() { // Function Call to find the // sides of the pentagon int i{ getting pentagon side() }; // Print the sides cout << "sides in a pentagon is: " << i; return 0; } |
Выход: