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++允许多次声明,只要不相互冲突,但是不允许重复定义,可能是因为定义涉及到代码空间的分配问题,而声
明只是告诉你有一个什么样的东西。
#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++头文件中为何添加了#ifndef #define #endif还会出现变量重复定义的问题
- C++多个头文件重复定义变量问题
- #pragma once 与#ifndef,#define,#endif的差别 、重复定义等相关问题
- C/C++语言中全局变量重复定义问题的解决方法
- 多个.c .h文件时出现的重复定义错误问题
- c++ 中头文件重复定义的问题
- 解决C/C++语言中全局变量重复定义的问题
- Cocos中在.h文件定义的指针类型变量不实例化会在析构时出现问题
- 关于头文件变量重复定义问题怎么解决(thinkvd开发日志)
- C++添加一个头文件和extern以及全局变量和局部变量问题(16.3.19上机的一小题)
- C++ 中枚举变量出现定义重复
- c++ 变量的重复定义问题 [multiple definition of] 与模板类
- C++ 中头文件重复定义的问题
- 转 c++ 中头文件重复定义的问题
- C/C++中常出现的#ifndef,#define,#endif解析
- C++基础之两个头文件使用同一个变量会重复定义怎么办
- 头文件中写类的实现出现函数重复定义的问题
- 个问题: 1、头文件重复包含 2、头文件加了ifndef条件预处理指令为什么还会定义
- 如何避免重复包含一个文件? #ifndef、#define、#endif
- 两个问题: 1、头文件重复包含 2、头文件加了ifndef条件预处理指令为什么还会定义