📜  C++中的标题保护

📅  最后修改于: 2021-05-30 02:08:01             🧑  作者: Mango

C++中的Header Guard是条件编译指令,有助于避免由于程序员的错误多次定义相同的函数或变量而引起的错误。根据C++,当多次定义函数或变量时,将产生错误。下面是说明相同内容的程序:

程序1:

C++
// C++ program to illustrate error
// caused due to defining same
// function more than once
#include 
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;
}


C++
// C++ program to illustrate error
// caused due to defining same
// variable more than once
#include 
using namespace std;
  
// Driver Code
int main()
{
    // error: note: 'double x' previously
    double x{};
  
    // declared here
    int x{ 2 };
  
    return 0;
}


C++
// Function to get the side of
// the pentagon
int getting_pentagon_side()
{
    // Return the side
    return 5;
}


C++
// Including another header file
// "pentagon.h" in the current program
#include "pentagon.h"


C++
// C++ program to illustrate the error
// discussed above
#include 
  
// Include header files created
#include "mathematics.h"
#include "pentagon.h"
using namespace std;
  
// Driver Code
int main()
{
  
    return 0;
}


C++
// C++ program to illustrate how to
// avoid errors using Header Guard
#include 
  
// 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;
}


输出:

解释:
在上面的程序中,函数fool()已被定义两次,这将导致致命错误。

程式2:

C++

// C++ program to illustrate error
// caused due to defining same
// variable more than once
#include 
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"
  • 现在,将创建一个名称为“ pentagon.cpp”的C++程序,如下所示:

程序3:

C++

// C++ program to illustrate the error
// discussed above
#include 
  
// 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

int getting_pentagon_side()
{ 
return 5;
}
#endif

  • 现在,包含“ pentagon.h”“ mathematics.h”头文件被修改为:
#ifndef MATHEMATICS_H
#define MATHEMATICS_H
#include "pentagon.h"
#endif

下面是经过上述更改以避免错误的程序:

C++

// C++ program to illustrate how to
// avoid errors using Header Guard
#include 
  
// 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等的更多准备工作,请参阅“完整面试准备课程”