Chinaunix首页 | 论坛 | 博客
  • 博客访问: 14777
  • 博文数量: 6
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 47
  • 用 户 组: 普通用户
  • 注册时间: 2013-04-19 14:55
文章分类

全部博文(6)

文章存档

2013年(6)

我的朋友

分类: C/C++

2013-04-19 15:17:48

这里参照维基百科的有关讲解进行举例说明。
首先,我们定义一个“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是很重要的,当时我查询这个语句的时候很多人都没说清楚这些语句的细节问题,今天在这里把细节给大家说说,希望对大家都所帮助!





阅读(601) | 评论(1) | 转发(0) |
给主人留下些什么吧!~~

校长的马夹2013-04-22 10:38:19

学习了