如何在C ++中更清楚地包含头文件

时间:2012-06-12 04:21:21

标签: c++ c header-files

在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非常奇怪。我该怎么做才能避免这种情况以及包含头文件的最佳做法是什么?

3 个答案:

答案 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问题

#include header guard format?

答案 2 :(得分:0)

为避免出现与多次导入相同头文件相关的问题,您可以使用预处理器来防范。通常的做法是将这些位添加到Base.h

#ifndef BASE_H_CONSTANT
#define BASE_H_CONSTANT

// Stick the actual contents of Base.h here

#endif