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