转自: https://www.cnblogs.com/qytan36/archive/2010/04/04/1704212.html
我们都知道为了避免头文件被#include多次,我们通常会在头文件上加上上述机制,比如 temp.h
#ifndef _TEMP_H
#define _TEMP_H
……
#endif
这样在同一个编译单元(Compilation Unit)中该头文件只会被包含一次。
但是这样是否就万无一失了呢?
有一次,一朋友问我为何他的程序中还会出现变量重复定义的错误
我看了一下他的代码,大概一个头文件类似以下格式写的
#ifndef _A_H
#define _A_H
int i = 10;
void f()
{
…
}
#endif
这里就有问题了,他的头文件与我们普通的不一样,一般我们头文件只是用了声明,而上述则定义了一个i变量与f函数。
根据我的理解,在一个项目中,有时候会出现多个编译单元,比如在Linux环境下,我们经常是先生成若干个.o文件,这其中就会有多个编译单元,那么该头文件在有可能被其中的某几个编译单元所包括了,在编译产生最后的输出文件时,相互链接时就会发现重定义。
为此可以将上述头文件改为:
#ifndef _A_H
#define _A_H
extern int i;
void f();
#endif
//a.cpp
#include “a.h”
int i = 10;
void f() {…}
这样修改完了之后就编译正常了。
因为多个编译单元可以存在相同的声明,C++允许多次声明,只要不相互冲突,但是不允许重复定义,可能是因为定义涉及到代码空间的分配问题,而声明只是告诉你有一个什么样的东西。