多次包含头文件c ++

时间:2010-05-14 05:32:37

标签: c++

我有一个关于在C ++代码中多次包含头文件的问题。

例如,我说有三个X,Y,Z类。 X和Y派生自Base类Z.我想在Y中创建一个X实例。代码将是这样的。

class Z{some code}

class X:public Z{some code};//here #include header of class Z added

class Y:public Z //here #include header of class Z added as well as of X class

{private:
   X* mX;//instance of X 

 some code};

所以在这个基类的所有方法的多重定义中出现了。我该如何应对这个问题

4 个答案:

答案 0 :(得分:8)

使用“包含警卫”(Wikipedia link

#ifndef MYHEADER_H
#define MYHEADER_H

// header file contents go here...

#endif // MYHEADER_H

这是惯用的代码,任何经验丰富的C和C ++程序员都可以轻松识别。将MYHEADER_H更改为特定于您的内容,例如,如果标头定义了名为CustomerAccount的类,则可以调用警卫CUSTOMERACCOUNT_H


在您的特定情况下,为每个类都有一个单独的头/源文件。 Z类的头文件将包含一个include guard:

#ifndef Z_H
#define Z_H

// Code of Z class

#endif Z_H

现在,X和Y的标题可以安全地包含z.h - 它只会被包含在.cpp文件中,包含x.hy.h并且不会发生重复。

始终记住,在C和C ++中,实际编译的是源(.c或.cpp)文件,而不是头文件。头文件只是由预处理器“复制粘贴”到include个源文件中。

答案 1 :(得分:3)

您还可以在头文件中使用 #pragma once 预处理程序指令。 (无需担心#ifndef #define #endif)

答案 2 :(得分:1)

你使用所谓的包括守卫或头部守卫。他们是这样的:

// within some_header.h
#ifndef SOME_HEADER_H
#define SOME_HEADER_H

// stuff goes here

#endif

基本上,第一次围绕宏尚未定义,因此包含了内部的所有内容。但是,在第一次后续包含后将无效。

与所有命名方案一样,命名方案完全是任意的,由您决定。我喜欢以这种方式将文件名包含在内,就像我上面所做的那样。我还在我的实际项目中包含名称空间和项目名称。

有几件事需要注意。你可能想做这样的事情:

#define _SOME_HEADER_H__

稍微混淆一下。但是,以下划线后跟大写字母或包含双下划线的名称是保留标识符,您无法使用它们。

答案 3 :(得分:-1)

这里是避免项目中包含多个标题的简单方法。

//MYCLASS.h
#ifndef _MYCLASS_H_
#define _MYCLASS_H_

class CMyClass
{
public:
    CMyClass();
}

#endif //_MYCLASS_H_