在C++/C中,一般的函数与全局变量的申明都会放在.H文件中,而且会在相应的.C文件中对函数和变量进行定义.全局变量在头文件中前面要加上EXTERN,定义时则不用
如果你在.H文件中对函数或变量直接定义,这个头文件只被一个文件包含是不会出错的,但是一旦它被两个或更多的文件包含,则会报错.编译器会告诉你函数或变量重复定义!
你可能会说,我不是已经在头文件中加上了防止重复引用的措施了吗?
#ifndef...
#define...
函数或变量的定义..
 
        #endif    
实际上这种措施只能防止在一个文件中对头文件的重复引用:在一个文件中一个头文件被引用了一次之后,再次引用时会首先判断是否已被引用过,若是则跳过,这样就防止了头文件的重复引用.若有多个文件引用同一头文件,则会出错,例如:
 
//f.h
#ifndef _F1_H_
#define _F1_H_
int a;
#endif
//f1.cpp
#include "f1.h"
main()
{
cout<<a<<endl;
}
//f2.cpp
#include "f1.h"
void fun2()
{
cout<<a<<endl;
}
宏的作用域:宏的作用域只在一个文件中.
错误的原因是:f1.cpp首先引用了头文件,包含了a的定义,然后在f2.cpp中再次引用了f1.h,f1.h首先会进行判断是否定义了宏_F1_H_,因为宏的作用域没有超过一个文件的范围,所以判断的结果是_F1_H_没有被定义过--虽然f1.cpp中已经定义过一次,但是它是局部的!a在f2.cpp中再次被定义!