2

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

4

3 回答 3

8

您应该.Base.h

一个例子:

// 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
于 2012-06-12T04:24:36.530 回答
4

您必须使用标头保护来避免重复。

http://en.wikipedia.org/wiki/Include_guard

例如在您Base.h添加以下内容:

#ifndef BASE_H_
#define BASE_H_

// stuff in Base.h

#endif

有关听到的保护格式,请参阅此 SO 问题

#include 标头保护格式?

于 2012-06-12T04:31:09.917 回答
0

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

#ifndef BASE_H_CONSTANT
#define BASE_H_CONSTANT

// Stick the actual contents of Base.h here

#endif
于 2012-06-12T04:25:23.333 回答