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

转自: 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++允许多次声明,只要不相互冲突,但是不允许重复定义,可能是因为定义涉及到代码空间的分配问题,而声明只是告诉你有一个什么样的东西。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值