在创建 C++ 头文件时,我将头文件声明为;
/*--- Pencere.h ---*/
#ifndef PENCERE_H
#define PENCERE_H
我想知道为什么我需要写下划线。
最佳答案
您不需要使用下划线,它只是分隔标题名称和扩展名的约定。您不能使用文字 .
,因为它在标识符中无效,因此您可以将其替换为有效的下划线。
你实际这样做的原因是作为一个包含守卫。文件的全部内容类似于:
#ifndef PENCERE_H
#define PENCERE_H
// Your stuff goes here.
#endif
这样,如果您不小心将其包含两次:
#include "pencere.h"
#include "pencere.h"
您不会复制其中的所有内容。双重包含通常比这更微妙 - 例如,您可以在代码中包含
pax.h
和 diablo.h
并且 pax.h
也出于其目的而包含 diablo.h
:main.c:
#include "pax.h"
#include "diablo.h"
// Other stuff
pax.h:
#ifndef PAX_H
#define PAX_H
#include "diablo.h"
// Other stuff
#endif
diablo.h:
#ifndef DIABLO_H
#define DIABLO_H
typedef int mytype;
#endif
在这种情况下,如果包含守卫不存在,您将尝试在程序中编译
typedef int mytype;
行两次。一次用于 main.c -> pax.h -> diablo.h
,再次用于 main.c -> diablo.h
。使用包含守卫,当
DIABLO_H
包含 main.c
时定义预处理器符号 diablo.h
,因此不处理 #define
和 typedef
。在您有
#define
和 dir1/pax.h
的情况下,头文件到 dir2/pax.h
名称的这种特殊映射会失效,因为它们都使用 PAX_H
。在这种情况下,您可以使用 DIR1_PAX_H
和 DIR2_PAX_H
之类的方案来解决问题。关于c++ - 为什么 headerFileName_H,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3298652/