define作用域.doc
文本预览下载声明
#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;
显示全部