如何防止头文件被重复包含?

在windows平台下,有一个很方便的宏: 
#pragma once

指定当前文件在构建时只被包含(或打开)一次,这样就可以减少构建的时间,因为加入#pragma once后,编译器在打开或读取第一个#include 模块后,就不会再打开或读取随后出现的相同#include 模块.

另外,还可以用条件编译语句来实现:

#ifndef "XX_H"

#define "XX_H" 

<头文件定义正文>

#endif

显然后者的移植性更好一点。


有下面的自定义结构体,定义在sample.h中。
--------------------------------------------
typedef struct sample{
 int trueNumber;
 double feature[13]; 
}SAMPLE;
--------------------------------------------

类A,类B都#include<sample.h>,主程序都调用了类A,类B;就会出现

error C2011: ''sample'' : ''struct'' type redefinition

解决方法:写上宏定义:

-----------------------------------
#ifndef sample_H_H
#define  sample_H_H
   typedef struct sample{
   int trueClass;
   double feature[13];
  }SAMPLE;
#endif
---------------------------------------

也可以这样写

----------------------------------
#if !define sample_H_H
#define sample_H_H
   typedef struct sample{
   int trueClass;
   double feature[13];
  }SAMPLE;
#endif
-------------------------------

意思是:

if(宏sample_H_H,没有被定义过)
{
      定义宏sample_H_H
      ........(执行)other code
}
实际上sample_H_H作为一个标记而存在

自定义一个类时,在所有的头文件中都应用这组宏处理
注意是#ifndef不是#ifdef

-----------------------------------
#ifndef 标记名(常以类名_H_H,两个标记名要相同)
#define  标记名

//你原来的文件内容

#endif
---------------------------------

posted on 2009-11-10 14:14 wrh 阅读(1346) 评论(0)  编辑 收藏 引用


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理


导航

<2009年11月>
25262728293031
1234567
891011121314
15161718192021
22232425262728
293012345

统计

常用链接

留言簿(19)

随笔档案

文章档案

收藏夹

搜索

最新评论

阅读排行榜

评论排行榜