文档详情

define作用域.doc

发布:2017-06-07约1.82千字共4页下载文档
文本预览下载声明
#ifndef头文件卫士是为了保证类的头文件在一个.cpp文件中被多次引用后不会出现重复定义的问题,注意,只是防止在一个.cpp文件中被多次引用。 #ifndef ELEMTYPE_H #define ELEMTYPE_H 的意思是,如果前面没有定义ELEMTYPE_H,那么现在定义ELEMTYPE_H。它不需要有值,只是表明是否被定义过,它的作用是为了防止头文件的重复定义。 下面举个例子: 你在a.h里定义了一个类a: Class a 然后在b.h里定义了一个类b,而且引用了a.h: #include “a.h” Class b 这样编译器在编译时,b.h的实际内容是: Class a Class b 这时还没有问题,然后你在c.cpp中引用了a.h和b.h: #include “a.h” #include “b.h” 那么,编译器在编译的时候会把a.h和b.h里的内容原封不动的填进来以替换这两句,这样c.cpp就变为: Class a Class a Class b 这时,就发生错误了,类a重复定义了。解决办法是这样: //a.h #ifndef A_H #define A_H Class a #endif //b.h #ifndef B_H #define B_H #include “a.h” Class b #endif 那么,c.cpp展开后为: #ifndef A_H #define A_H Class a #endif #ifndef B_H #define B_H #ifndef A_H #define A_H Class a #endif Class b #endif 可以看到,执行第一次class a的定义时,由于宏A_H未定义,故此时执行类a的定义,并定义A_H,然后执行第二次class a的时候,发现A_H已经定义,因此跳过a的再次定义,避免了重复定义。 在#ifndef中定义变量出现的问题(一般不在#ifndef中定义) 例如,在AAA.h中: #ifndef AAA_H #define AAA_H nt i; #endif 里面定义了一个变量,则在VC链接时就出现了i重复定义的错误。 原因是: 当你第一个使用AAA.h头的.cpp文件生成.obj的时候,int i在里面定义了。当另外一个使用AAA.h头的.cpp再次[单独]生成.obj的时候,int i又被定义。然后两个.obj链接在一起的时候,就会出现重复定义。 特别注意:.cpp文件中的代码#include某个.h文件相当于将.h文件中的内容复制到该.cpp文件中,且不同的.cpp文件引用同一个带#ifndef的头文件时,都会将.h中的代码复制到.cpp中。如上面,如果a.cpp和b.cpp都引用了AAA.h,则a.cpp中第一次回define AAA_H,但因为b.cpp是独立于a.cpp的,所以AAA_H对于b.cpp来说也未定义,所以他仍然会定义int i 。 对于正常的类 C.h声明类C,C.cpp实现类C,main.cpp调用类C : //C.h #ifndef HEADER_C #define HEADER_C lass C Public:int Fn ; ; #endif //C.cpp #include “C.h” int C::Fn return 1; //main.cpp #include “C.h” main C c; cout c.Fn endl; 上例中,C.cpp变为: #ifndef HEADER_C #define HEADER_C Class C Public:int Fn ; ; #endif nt C::Fn return 1; 会定义一个class C;而且在main.cpp中也同样会定义一个class C;因为main.cpp中的HEADER_C与C.cpp中的HEADER_C是独立的,不相干的,单独编译的。所以也会定义一个class C,但是编译是通过的,这是因为在多个.cpp中类型定义 class C 可以重复,但一个.cpp中不行,这就是头文件卫士的作用。 推荐解决方案是:.h中只声明extern int ; //AAA.h #ifndef _X_H_ #define _X_H_ extern int I; #endif;
显示全部
相似文档