现在的位置: 首页 > 综合 > 正文

C++头文件中为何添加了#ifndef #define #endif还会出现变量重复定义的问题

2013年01月22日 ⁄ 综合 ⁄ 共 614字 ⁄ 字号 评论关闭

我们都知道为了避免头文件被#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++允许多次声明,只要不相互冲突,但是不允许重复定义,可能是因为定义涉及到代码空间的分配问题,而声明只是告诉你有一个什么样的东西。

抱歉!评论已关闭.