我一直在头文件的开头看到这样的代码:
#ifndef HEADERFILE_H
#define HEADERFILE_H
在文件末尾是
#endif
这是为了什么目的?
答案 0 :(得分:452)
这些被称为#include guards。
包含标头后,它会检查是否定义了唯一值(在本例中为HEADERFILE_H
)。然后,如果它没有定义,它会定义它并继续到页面的其余部分。
当再次包含代码时,第一个ifndef
失败,导致出现空白文件。
这可以防止双重声明任何标识符,例如类型,枚举和静态变量。
答案 1 :(得分:29)
#ifndef <token>
/* code */
#else
/* code to include if the token is defined */
#endif
#ifndef
检查给定标记在文件或包含文件中是否早于#defined
;如果没有,则包含它与结束#else
之间的代码,或者,如果不存在#else
,则包含#endif
语句。 #ifndef
通常用于通过在包含文件后定义令牌并检查令牌未设置在该文件的顶部来使头文件具有幂等性。
#ifndef _INCL_GUARD
#define _INCL_GUARD
#endif
答案 2 :(得分:7)
这可以防止多次包含相同的头文件。
#ifndef __COMMON_H__
#define __COMMON_H__
//header file content
#endif
假设您已将此头文件包含在多个文件中。所以第一次 __COMMON_H__未定义,它将被定义并包含头文件。
下次定义__COMMON_H__时,它将不再包含。
答案 3 :(得分:0)
它们被称为ifdef或包括守卫。
如果编写一个小程序,似乎不需要它,但是随着项目的发展,您可能会有意或无意地多次包含一个文件,这可能导致编译警告,如已声明的变量。
#ifndef checks whether HEADERFILE_H is not declared.
#define will declare HEADERFILE_H once #ifndef generates true.
#endif is to know the scope of #ifndef i.e end of #ifndef
如果未声明,则意味着#ifndef生成true,则仅执行#ifndef和#endif之间的部分,否则不执行。这样可以避免再次声明标识符,枚举,结构等。