Header Guard в C ++

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

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;
}

Выход:

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