在C ++中,我有一些头文件,例如:Base.h
,以及一些使用Base.h
的类:
//OtherBase1.h
#include "Base.h"
class OtherBase1{
// something goes here
};
//OtherBase2.h
#include "Base.h"
class OtherBase2{
// something goes here
};
在main.cpp
中,由于标题重复,我只能使用这两个OtherBase
类中的一个。如果我想同时使用这两个类,请OtherBase2.h
#include "OtherBase1.h"
而不是#include "Base.h"
。有时,我只想使用OtherBase2.h
而不是OtherBase1.h
,所以我认为在OtherBase1.h
中加入OtherBase2.h
非常奇怪。我该怎么做才能避免这种情况以及包含头文件的最佳做法是什么?
答案 0 :(得分:8)
您应该在Base.h
中使用include guards。
一个例子:
// Base.h
#ifndef BASE_H
#define BASE_H
// Base.h contents...
#endif // BASE_H
这样可以防止多次包含Base.h
,您可以同时使用OtherBase
个标头。 OtherBase
标题也可以使用包含警示。
根据特定标头中定义的API的可用性,常量本身对于代码的条件编译也很有用。
替代方案: #pragma once
请注意,#pragma once
可用于完成相同的操作,而不会出现与用户创建的#define
常量相关的一些问题,例如名称冲突,偶尔打字#ifdef
而不是#ifndef
,或忽略关闭条件的轻微烦恼。
#pragma once
通常可用,但包括警卫随时可用。事实上,您经常会看到以下形式的代码:
// Base.h
#pragma once
#ifndef BASE_H
#define BASE_H
// Base.h contents...
#endif // BASE_H
答案 1 :(得分:4)
您必须使用标头防护来避免重复。
http://en.wikipedia.org/wiki/Include_guard
例如,在Base.h
添加以下内容:
#ifndef BASE_H_
#define BASE_H_
// stuff in Base.h
#endif
对于听到的警卫格式,请参阅此SO问题
答案 2 :(得分:0)
为避免出现与多次导入相同头文件相关的问题,您可以使用预处理器来防范。通常的做法是将这些位添加到Base.h
:
#ifndef BASE_H_CONSTANT
#define BASE_H_CONSTANT
// Stick the actual contents of Base.h here
#endif