0

头文件中的包含保护通常用于保护代码部分免受双重包含:

#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

4

3 回答 3

2

a 的标准语法产生replacement-list是:pp-tokens [opt]. 因此,替换列表不需要任何标记才能有效。

对于定义为“空”的宏,因此#ifdef可以正常工作并按预期工作。大量代码依赖于此。

于 2013-06-27T21:06:20.420 回答
1

不,它没有。替换列表很可能是空的。#define FOO表示这defined FOO是真的,但FOO被替换为空。

例子:

#define FOO
#define BAR 1

#if defined FOO && defined BAR
int a = FOO + BAR ;
#endif

预处理结果:

int a = + 1 ;
于 2013-06-27T20:57:25.950 回答
0

不; 宏替换不会发生在该#ifndef行中。如果是这样,那么整个语句将是一个语法错误(因为后面不会有任何内容#ifndef)。

我想我实际上已经看到了一些例子,#define FOOBAR_H 1但这更多的是个人品味。

于 2013-06-27T21:00:40.000 回答