为什么在C ++头文件中使用#ifndef和#define?

Why are #ifndef and #define used in C++ header files?

我一直在头文件的开头看到这样的代码:

1
2
#ifndef HEADERFILE_H
#define HEADERFILE_H

并在文件的最后是

1
#endif

这样做的目的是什么?


这些被称为#include警卫。

包含标头后,它会检查是否定义了唯一值(在本例中为HEADERFILE_H)。然后,如果未定义,则定义它并继续到页面的其余部分。

再次包含代码时,第一个ifndef失败,导致出现空白文件。

这可以防止双重声明任何标识符,例如类型,枚举和静态变量。


1
2
3
4
5
#ifndef <token>
/* code */
#else
/* code to include if the token is defined */
#endif

#ifndef检查给定标记在文件或包含文件中是否早于#defined;如果没有,它包括它与结束#else之间的代码,或者,如果没有#else,则包含#endif语句。 #ifndef通常用于通过在包含文件后定义令牌并检查令牌未设置在该文件的顶部来使头文件具有幂等性。

1
2
3
#ifndef _INCL_GUARD
#define _INCL_GUARD
#endif


这可以防止多次包含相同的头文件。

1
2
3
4
#ifndef __COMMON_H__
#define __COMMON_H__
//header file content
#endif

假设您已将此头文件包含在多个文件中。所以第一次
__COMMON_H__未定义,它将被定义并包含头文件。

下次定义__COMMON_H__时,它将不再包含。