为什么有些人包含守卫有定义值?

时间:2014-06-20 09:18:17

标签: include include-guards

通常在使用包含警卫时我会这样写:

#ifndef FILENAME_H
#define FILENAME_H

...

#endif // FILENAME_H

现在在一些图书馆里,我见过类似的东西:

#ifndef FILENAME_H
#define FILENAME_H 1

...

#endif // FILENAME_H

经过一些研究后,我没有找到任何理由说明为什么需要初始化包含gurad。

有没有理由这样做?

1 个答案:

答案 0 :(得分:1)

虽然我从未见过这样的编译器,但我被告知“空”定义可能被视为未定义。 我对哪个编译器的行为非常感兴趣。

即使C89也声明: 3.8.1有条件的包含 约束

控制条件包含的表达式应为

形式的整数常量表达式[...]

已定义的标识符

已定义(标识符)

如果标识符当前被定义为宏名称(即,如果它是预定义的,或者它是#define预处理指令的主题,而没有介入的具有相同主题标识符的#undef指令),则计算结果为1 ,如果不是,则为0。