您的位置:首页 > 编程语言 > C语言/C++

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

2010-05-16 12:13 621 查看
我们都知道为了避免头文件被#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++允许多次声明,只要不相互冲突,但是不允许重复定义,可能是因为定义涉及到代码空间的分配问题,而声
明只是告诉你有一个什么样的东西。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c++ compilation linux c