头文件中的包含保护通常用于保护代码部分免受双重包含:
#ifndef FOOBAR_H
#define FOOBAR_H
extern void myfoofunc(void);
#endif
包含守卫通常依赖于这样的期望,即如果已经定义了类似对象的宏,#ifndef
则不会包含块内的行——从而避免双重包含。
我注意到#define
许多包含标题的行都有空的替换列表。C99 标准是否保证用空替换列表定义的类对象宏将被视为“定义” #ifndef
?
在描述 的语法时#define
,C99 标准似乎暗示第 6.10.3 节第 9 段中需要替换列表:
形式的预处理指令
# 定义 标识符替换列表换行
定义了一个类似对象的宏,它使宏名称的每个后续实例都被构成指令其余部分的预处理标记的替换列表替换。然后重新扫描替换列表以获取更多宏名称,如下所示。
这是否意味着包含标题应该采用以下形式:#define FOOBAR_H 1
?