2014-06-20 127 views
1

通常使用包括警卫,当我写出来,像这样:为什么一些包括卫兵有定义的价值?

#ifndef FILENAME_H 
#define FILENAME_H 

... 

#endif // FILENAME_H 

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

#ifndef FILENAME_H 
#define FILENAME_H 1 

... 

#endif // FILENAME_H 

一些启发式算法后,我没有找到任何理由来为什么包括古拉德需要被初始化。

是否有任何理由这样做?

回答

1

尽管我从来没有见过这样的编译器,但我被告知一个“空的”定义可能被视为未定义。 我对哪种编译器的行为非常感兴趣。

即使C89状态: 3.8.1条件包含 约束

控制条件包含应整数表达式表达式[...]的形式

定义的标识符的

(标识符)

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

+0

不幸的是我不记得我在哪里看到的,这可能是一些数学函数库。它在linux下。 – Ragas