gpt4 book ai didi

c++ - 包含头文件的顺序是什么?

转载 作者:可可西里 更新时间:2023-11-01 18:21:46 25 4
gpt4 key购买 nike

我是编程新手,在我开始大量使用头文件之后,头文件的话题让我有些困惑。除此之外,我正在尝试使用预编译的头文件。我也在使用 SFML 库,所以我有那些也必须包含的 header 。

现在我有 stdafx.h、main.cpp,然后类 A、B、C 和 D 包含在 A.h、A.cpp、B.h、B.cpp、C.h、C.cpp、D.h 和 D 中。

如果

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

stdafx.h:

#include <SFML/Graphics.hpp>
#include <iostream>

啊啊

#include "stdafx.h"
class A
{
//sfml class
};

A.cpp

#include "stdafx.h"
#include "A.h"

B.h

#include "stdafx.h"
class B
{
//sfml class
};

B.cpp

#include "stdafx.h"
#include "B.h"

C.h

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

};

C.cpp

#include "stdafx.h"
#include "C.h"

D.h

#include "A.h"
#include "C.h"
class D
{
A a;
C C; // if left uncommented I recieve a '1 unresolved externals' error
//sfml class
}

D.cpp

#include "stdafx.h"
#include "D.h"

主要.cpp

#include "stdafx.h"
#include "D.h"

最佳答案

我的理念是,在编写良好的代码中,头文件应该包括它们所依赖的所有其他头文件。我的理由是,不应该包含头文件并因此导致编译器错误。因此,每个头文件应该(在 #ifdef#pragma once include guard 之后)包含它所依赖的所有其他头文件。

为了非正式地测试您是否记得在头文件中包含正确的头文件,*.cpp 文件应该 #include 应该工作的最小头文件集。因此,如果 A 有单独的头文件, B , CD ,并且您的 cpp 文件使用类 D , 那么它应该只包含 D.h。不会产生编译器错误,因为 D.h #include s A.hC.hC.h包括B.h,而A.h B.h 包含 SFML header (无论是什么)。 C.hD.h 可以包含 SFML header ,如果它看起来合适,但它不是真正必要的,如果你可以确定依赖项(B.hA.h) 已经包含了它。

但是,Visual C++ 处理“预编译头文件”的方式搞砸了这个逻辑。它要求您包括"StdAfx.h"作为第一个头文件,这导致许多开发人员简单地将所有 #include s 用于 StdAfx.h 中的整个项目,并且不使用 #include在任何其他头文件中。我不推荐这个。或者,他们会将所有外部依赖项放入 StdAfx.h(例如 windows.h、boost headers)并在其他地方#include 本地依赖项,这样更改单个头文件不一定会导致整个项目重建。

按照我编写代码的方式,我的大部分 CPP 文件都包含 StdAfx.h 和相应的 .H 文件。所以 A.cpp 包括 StdAfx.h 和 A.h,B.cpp 包括 StdAfx.h 和 B.h,等等。唯一的其他#include放在 cpp 文件中的 s 是头文件未公开的“内部”依赖项。例如,如果类 A电话 printf() , 那么A.cpp(不是A.h)会#include <stdio.h> ,因为 A.h 不依赖于 stdio.h

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

关于c++ - 包含头文件的顺序是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5559432/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com