我在什么顺序包含头文件?

oro*_*rod 7 c++ header class include precompiled

我是编程的新手,头文件的主题在我开始使用它们之后会让我失望.除此之外,我正在尝试使用预编译的头文件.我也在使用SFML库,所以我必须包含那些标题.

现在我有stdafx.h,main.cpp,然后是Ah,A.cpp,Bh,B.cpp,Ch,C.cpp,Dh和D.cpp中包含的类A,B,C和D.

如果包含所有文件中的标题,我将采用什么顺序?

  • 所有类都包含SFML类的实例
  • D类包含A类和C类的实例
  • C类包含B类的实例我的代码:(注意:所有标题都有标题保护)

stdafx.h中:

#include <SFML/Graphics.hpp>
#include <iostream>
Run Code Online (Sandbox Code Playgroud)

#include "stdafx.h"
class A
{
    //sfml class
};
Run Code Online (Sandbox Code Playgroud)

A.cpp

#include "stdafx.h"
#include "A.h"
Run Code Online (Sandbox Code Playgroud)

BH

#include "stdafx.h"
class B
{
    //sfml class
};
Run Code Online (Sandbox Code Playgroud)

B.cpp

#include "stdafx.h"
#include "B.h"
Run Code Online (Sandbox Code Playgroud)

#include "B.h"
class C: public B
{

};
Run Code Online (Sandbox Code Playgroud)

C.cpp

#include "stdafx.h"
#include "C.h"
Run Code Online (Sandbox Code Playgroud)

DH

#include "A.h"
#include "C.h"
class D
{
    A a;
    C C; // if left uncommented I recieve a '1 unresolved externals' error
    //sfml class
}
Run Code Online (Sandbox Code Playgroud)

D.cpp

#include "stdafx.h"
#include "D.h"
Run Code Online (Sandbox Code Playgroud)

main.cpp中

#include "stdafx.h"
#include "D.h"
Run Code Online (Sandbox Code Playgroud)

Qwe*_*tie 10

我的理念是,在编写良好的代码中,头文件应该包含它们所依赖的所有其他头文件.我的理由是,不应该包含头文件并且因为这样做而得到编译器错误.因此,每个头文件应该(在包括后面#ifdef#pragma once 包括后卫)包括它依赖的所有其他头.

为了非正式地测试你记得在头文件中包含正确的标题,*.cpp文件应该#include应该有效的最小头文件集.因此,如果有单独的头文件A,B,CD,你的CPP文件使用类D,那么它应该只包括迪拉姆.不会产生编译器错误,因为Dh #include s AhCh,Ch包括Bh,而AhBh包括SFML头(无论是什么).如果看起来合适,ChDh可以包括SFML头,但是如果可以确定依赖关系(BhAh)已经包含它,那么它并不是必需的.

但是,Visual C++执行"预编译头"的方式搞砸了这种逻辑.它要求您包含"StdAfx.h"作为第一个头文件,这会导致许多开发人员简单地将所有#includes放在StdAfx.h中的整个项目中,而不是#include在任何其他头文件中使用.我不推荐这个.或者,它们将所有外部依赖项放在StdAfx.h中(例如,windows.h,boost标头)和#include其他地方的本地依赖项,以便更改单个头文件不一定会导致整个项目重建.

我编写代码的方式,我的大多数CPP文件包括StdAfx.h和相应的.H文件.所以A.cpp包括StdAfx.h和Ah,B.cpp包括StdAfx.h和Bh,依此类推.#include放在cpp文件中的唯一其他内容是头文件未公开的"内部"依赖项.例如,如果类A调用printf(),那么A.cpp(不是)会#include <stdio.h>,因为Ah不依赖于stdio.h.

如果您遵循这些规则,那么#include标头的顺序无关紧要(除非您使用预编译的标头:然后预编译的标头首先出现在每个cpp文件中,但不需要包含在头文件中).