为啥有些包含守卫具有定义的值?

Posted

技术标签:

【中文标题】为啥有些包含守卫具有定义的值?【英文标题】:Why do some include guards have a defined value?为什么有些包含守卫具有定义的值? 【发布时间】:2014-06-20 09:18:17 【问题描述】:

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

#ifndef FILENAME_H
#define FILENAME_H

...

#endif // FILENAME_H

现在在一些图书馆中我看到了类似的东西:

#ifndef FILENAME_H
#define FILENAME_H 1

...

#endif // FILENAME_H

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

这样做有什么理由吗?

【问题讨论】:

【参考方案1】:

虽然我从未见过这样的编译器,但有人告诉我“空”定义可以视为未定义。 我对哪个编译器的行为如此感兴趣。

甚至 C89 状态: 3.8.1 条件包含 约束

控制条件包含的表达式应该是一个整数常量表达式 [...] 的形式

定义的标识符

定义(标识符)

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

【讨论】:

遗憾的是我不记得我在哪里看到的,它可能是一些数学函数库。不过它是在 linux 下的。

以上是关于为啥有些包含守卫具有定义的值?的主要内容,如果未能解决你的问题,请参考以下文章

包括守卫风格,C++

为啥有些网站网址不包含文件扩展名?

为啥有些网站 url 不包含文件扩展名?

为啥有些单词没有被检查或包含在反向单词字符串中?

#pragma once 与包含守卫? [复制]

C++ 包含守卫