这里参照维基百科的有关讲解进行举例说明。
首先,我们定义一个“grandfather.h”,其内容为:
struct foo
{
int member;
};
然后定义“father.h”,它包括“grandfather.h”头文件,即:#include "grandfather.h"
最后定义“child.c”,它包括“grandfather.h”和“father.h”头文件,即:#include "grandfather.h"、#include "father.h"
此处child.c间接引入了两份grandfather.h中的内容。明显可以看出,foo结构被定义两次,因此会造成编译错误。
所以我们为了防止"grandfather.h"进行两次编译,就采用了#ifndef、#define以及#endif的使用。即:
#ifndef <标识>
#define <标识>
程序内容
#endif
现在我们把上面的例子进行这样的设计。即:“grandfather.h”,其内容为:
#ifndef H_GRANDFATHER
#define H_GRANDFATHER
struct foo
{
int member;
};
#endif
其他的设计保持不变。
所以grandfather.h第一次被引入时会定义宏H_GRANDFATHER(#define H_GRANDFATHER),所以在第二次被引入时,由于已经执行了#define H_GRANDFATHER(即:定义了宏H_GRANDFATHER),所以不满足#ifndef H_GRANDFATHER(这个语句的意思是没有定义宏H_GRANDFATHER才执行下面的程序,但是我们已经定义了宏H_GRANDFATHER),所以不会进行第二次定义foo结构,所以#define H_GRANDFATHER是很重要的,当时我查询这个语句的时候很多人都没说清楚这些语句的细节问题,今天在这里把细节给大家说说,希望对大家都所帮助!
阅读(609) | 评论(1) | 转发(0) |