我应该按照什么顺序包含头文件?

2024-01-23

我是编程新手,在我开始使用大量头文件后,头文件的主题让我陷入了困境。除此之外,我正在尝试使用预编译头。我还使用 SFML 库,因此我还必须包含那些标头。

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

如果我将按照什么顺序将标题包含在所有文件中

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

stdafx.h:

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

A.h

#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"

main.cpp

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

我的理念是,在编写良好的代码中,头文件应该包含它们所依赖的所有其他头文件。我的理由是,不应该包含头文件并因此而出现编译器错误。因此,每个头文件应该(在#ifdef or #pragma once 包括警卫 http://en.wikipedia.org/wiki/Include_guard) 包括它所依赖的所有其他标头。

为了非正式地测试您是否记得在头文件中包含正确的头文件,*.cpp 文件应该 #include 应该起作用的最小头文件集。因此,如果有单独的头文件A, B, C and D,并且您的 cpp 文件使用类D,那么它应该只包括D.h。不应导致编译器错误,因为D.h #includes A.h and C.h, C.h包括B.h, and A.h and B.h包含 SFML 标头(无论是什么)。C.h and D.h如果合适的话可以包含 SFML 标头,但如果您可以确定依赖项(B.h and A.h)已经包含了它。

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

按照我编写代码的方式,我的大多数 CPP 文件都包含 StdAfx.h 和相应的 .H 文件。因此,A.cpp 包括 StdAfx.h 和 A.h,B.cpp 包括 StdAfx.h 和 B.h,依此类推。唯一的另一个#include放置在 cpp 文件中的 s 是头文件未公开的“内部”依赖项。例如,如果类A calls printf(), then A.cpp (not A.h) would #include <stdio.h>, 因为A.h不依赖于stdio.h.

如果您遵循这些规则,那么您的顺序#include标头不要紧(除非您使用预编译头:那么预编译头位于每个 cpp 文件中的第一个,但不需要从头文件中包含)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

我应该按照什么顺序包含头文件? 的相关文章

  • C++ 标准是否允许未初始化的 bool 导致程序崩溃?

    我知道一个 未定义的行为 C 几乎可以让编译器做任何它想做的事情 然而 我遇到了一次令我惊讶的崩溃 因为我认为代码足够安全 在这种情况下 真正的问题仅发生在使用特定编译器的特定平台上 并且仅在启用优化的情况下发生 我尝试了几种方法来重现问题
  • TCP客户端;网络流;异步读取; C#

    请原谅我对任务和异步缺乏了解 使用 TcpClient 类 我正在创建与可用服务器的连接 void async RunClientAsync TcpClient client new TcpClient try await client C
  • 委托和接口如何互换使用?

    我可以使用接口方法代替委托吗 如何 我发现搜索接口方法比使用委托更快 我希望有一个简单的代码片段 理论上 可以通过包含单个方法的接口 例如 Java 没有委托 来完成委托完成的所有工作 然而 它使代码变得更加冗长并且没有带来什么好处 话又说
  • lambda 表达式到函数指针的转换

    这是这个问题的后续问题 Lambda 如何作为参数传递 https stackoverflow com questions 3321283 c0x lambda how can i pass as a parameter 据推测 MSDN
  • 用C#发送USSD?

    我想编写一个在 Windows Mobile 6 上运行的简单 C 应用程序 它可以发送 USSD 消息 有没有任何图书馆可以帮助我做到这一点 或者是否有任何示例解释如何使用线路发送USSD http msdn microsoft com
  • .NET Core 2 - 从启动中调用存储库方法[重复]

    这个问题在这里已经有答案了 我有以下存储库和类 public interface IValueService GetAll public class ValueService IValueService private DataContex
  • 析构函数、dispose 和 Finalize 方法之间的区别

    我正在研究垃圾收集器在 C 中的工作原理 我对使用感到困惑Destructor Dispose and Finalize方法 根据我的研究和理解 在我的类中拥有析构函数方法将告诉垃圾收集器以析构函数方法中提到的方式执行垃圾收集 该方法不能在
  • 服务器端包含与 ASP.NET 技术之间是否存在性能差异?

    我最近受聘更新 ASP NET 1 0 站点 该站点是在母版页可用之前创建的 因此 这些页面有服务器端包含 ssi 例如 我打算使用包含先前在 ssi 中的标记的母版页来更新 aspx 页面 我相信这是正确的做法 特别是从可维护性的角度来看
  • const_iterators 更快吗?

    我们的编码指南更喜欢const iterator 因为它们比正常的要快一点iterator 当您使用时 编译器似乎会优化代码const iterator 这真的正确吗 如果是的话 内部到底发生了什么使得const iterator快点 编辑
  • 如何在C中递归地找到另一个字符串中的字符串位置?

    我们有一个任务来创建带有两个字符串参数的递归函数 原型应该是这样的 int instring char word char sentence 如果我们愿意调用函数 instring Word Another Word 它应该具有以下返回值
  • 阻止用户取消选择列表框中的项目?

    我有一个列表框 里面有很多项目 用户可以单击某个项目来编辑其内容 如何防止用户取消选择所有项目 即 用户不应该无法选择任何内容 您的情况缺少一个案例 即清除列表后 您将选择列表中不再存在的项目 我通过添加额外的检查来解决这个问题 var l
  • 使用 unrar 库 - 将文件提取到文件流缓冲区中

    我需要的是能够将 rar 文件中的文件提取到流中 我正在创建一个测试用例来了解如何使用解压源文件 http www rarlab com rar unrarsrc 3 9 9 tar gz 我已经搜索和修补了一段时间 但我不知道如何使用该库
  • C++20 views::join 在生成的嵌套范围::single_view 上进入无限循环

    我正在使用 GCC 实现 v10 2 和 v11 来处理 C 20 范围 测试的行为std views join https en cppreference com w cpp ranges join view 我尝试使用生成嵌套视图sin
  • 通过 MVC 将数据写入数据库的最佳方法是什么?

    我正在使用 MVC 和 EF Core 开发一个家庭作业项目 我正在寻找将数据写入数据库的最佳方法 我是初学者 有两张桌子 Predbilje ba 报名 和Seminari 研讨会 public class Predbilje ba Ke
  • 将数组显式衰减为指针

    最简洁 最惯用的方式是什么明确地将数组衰减为指针 例如 考虑您需要能够指导 SFINAE 或明确过载的情况 template
  • 使用可变参数模板函数计算多个值的平均值

    我正在尝试编写一个函数来确定任意数量参数的平均值 所有参数都具有相同的类型 出于学习目的 我尝试使用可变参数模板函数来做到这一点 这是我到目前为止所拥有的 template
  • 定义一个断言,即使定义了 NDEBUG,该断言也有效

    我想定义一个assert与标准相同的宏assert 3 http man7 org linux man pages man3 assert 3 html调用 但它不会被预处理器删除NDEBUG被定义为 这样的呼唤 让我们称之为assert2
  • 在运行时将项目添加到 ToolStrip

    您好 我有一个带有 收藏夹 菜单的 ToolStripMenu 我想在运行时在 WinForms 应用程序中添加子项目 我有一个 datagridview 右键单击它会显示一个包含 添加到收藏夹 选项的上下文菜单 当该事件被触发时 我想使用
  • 返回右值 - 这段代码有什么问题? [复制]

    这个问题在这里已经有答案了 我遇到了以下代码片段 std string test std string m Hello return std move m int main std string m test 我知道上面的代码是不正确且不安
  • “while(true) { Thread.Sleep }”的原因是什么?

    我有时会遇到以下形式的代码 while true do something Thread Sleep 1000 我想知道这是否被认为是好的做法还是坏的做法以及是否有任何替代方案 通常我在服务的主函数中 找到 这样的代码 我最近在 Windo

随机推荐

  • 是否可以使用标准 android api 在屏幕上移动组件?

    我想制作一个android用户界面 允许用户移动添加components widgets通过选择它们然后拖动它们来在屏幕上移动 使用标准的 android api 可以吗 是的 这取决于您想要实现的目标 可以办到using标准 API 但此
  • 我需要打开哪些防火墙端口才能允许 Sinch 和 WebRTC 工作?

    Sinch 在互联网和各种 NAT 网络上运行得非常好 但我刚刚尝试了企业防火墙后面的设备 突然我们无法拨打电话 更具体地说 设备可以互相呼叫 但是当调用 onCallEstablished 时 音频流已连接 呼叫就会中断 听不到来自远端的
  • 防止渲染阻塞 CSS

    我有一个从 CDN 引用 Bootstrap 4 的网页 在里面head在我的 HTML 页面中 我有以下内容 这是我引用的唯一 CSS 然而 当我运行 Google 的 PageSpeed 工具时 出现以下错误 消除首屏内容中阻碍渲染的
  • 如何使用 JavaScript 按钮删除 gridview 上的一行并保留在同一页面上

    我正在通过 gridview 显示一组记录 并且edit and delete旁边的按钮 我在记录删除部分遇到问题 我想要的行为如下 用户单击按钮 调用 JavaScript 验证函数 单击按钮后记录将被删除 但用户与其余记录仍保留在同一页
  • 如何以编程方式操作 Windows 桌面图标位置?

    几年前 我天真地尝试编写一个小应用程序来保存我战术性放置的桌面图标 因为当某些事件重置它们时 我厌倦了将它们拖回原来的位置 在花费了太多时间未能找到一种方法来查询 更不用说保存和重置 我的图标的桌面位置后 我放弃了 有人知道 Windows
  • 如何使用 Rust 从 stdin 创建高效的字符迭代器?

    现在既然Read chars https doc rust lang org nightly std io trait Read html method chars迭代器已被正式弃用 https github com rust lang r
  • 如何从字符串中删除所有子字符串

    如何从字符串中删除该模式的所有实例 string str red tuna blue tuna black tuna one tuna string pattern tuna 从字符串中删除该模式的所有实例 include
  • java中抽象类和接口的最佳实践

    因此 您已经有了一个接口和一个实现接口中方法的子集的抽象类 您还拥有一些继承抽象类并提供抽象类未提供的方法的实现的类 那么这里的最佳实践是什么 我正在谈论这样的问题 1 抽象类应该实现接口还是它的子类 每节课都应该吗 在我看来 抽象类就应该
  • 将 MS Word 表格单元格提取为图像?

    我需要将表格单元格提取为图像 单元格可能包含混合内容 文本 图像 我需要将其合并为单个图像 我能够获得核心文本 但我不知道如何获得图像 文本 不确定 Apac POI 是否有帮助 之前有人做过类似的事情吗 public static voi
  • 使用 WPF 时的数据绑定问题

    我一直在努力学习Visual C 最近 我一直在关注WPF 这是我一直在制作的教程的链接 http msdn microsoft com en us library vstudio ms752299 v vs 110 aspx http m
  • JavaScript 加载顺序导致问题

    我在标头中有一个 JS 文件 这是用于 Google DFP 的 在 我发现如果头 JS 文件没有在底部文件之前加载 我会在 Chrome 控制台中收到此错误 Uncaught TypeError Object has no method
  • SQL Server - 缺少 NATURAL JOIN / x JOIN y USING(字段)

    我刚刚阅读了 NATURAL JOIN USING SQL92 功能 这些功能 遗憾的是 在 SQL Server 当前的功能中缺失了 有没有人从支持这些的 DBMS 转到 SQL Server 或其他不支持的 DBMS 它们是否像听起来那
  • Matplotlib imshow,基于缩放动态重采样

    我试图在 matplotlib 中复制 MATLAB imagesc 调用的行为 具体来说 对于非常大的图像 减少图像 当用户放大时 以较少的抽取显示图像 我已经编写了一个可以做到这一点的类 但我的解决方案似乎过于复杂 有人知道更好的方法吗
  • iOS上的BLE技术从哪一点入手

    我需要使用BLE技术进行开发 我找到了一些介绍和源码 http processors wiki ti com index php Category IPhone4SBLEDemo http processors wiki ti com in
  • 计算一个 div 可以容纳多少个字符(来自字符串)而不使其换行?

    所以我有一个 div div 我想知道在换行到下一行之前 字符串可以容纳多少 长度 脚本应考虑元素的宽度 真实宽度 clientWidth 左右边距以及左右内边距 div div 而 JavaScript 假设魔法函数是calculate
  • 将谷歌广告添加到Android应用程序

    我正在尝试将谷歌广告添加到我的应用程序 这是我第一次 我也添加了 jar 文件 这是 xml
  • MS Chart:如何更改条形图轴上每个标签的颜色?

    我有一个条形图 它在 Y 轴上显示不同的类别 我可以使用以下方法同时更改轴上所有颜色的颜色 chart ChartAreas MyChart AxisY LabelStyle ForeColor Red 但是它不允许我为每个设置颜色 任何帮
  • 将 URL 转换为绝对路径

    有没有简单的方法可以将包含两字节字符的 URL 转换为绝对路径 我问的原因是我正在尝试寻找这样的资源 URL url getClass getResources getresources test txt String path url t
  • 从目录获取文件时排除某些文件扩展名

    How to exclude从目录获取文件时的某些文件类型 I tried var files Directory GetFiles jobDir 不过这个功能好像只能选择你想要包含的文件类型 不能排除 你应该自己过滤这些文件 你可以这样写
  • 我应该按照什么顺序包含头文件?

    我是编程新手 在我开始使用大量头文件后 头文件的主题让我陷入了困境 除此之外 我正在尝试使用预编译头 我还使用 SFML 库 因此我还必须包含那些标头 现在我有 stdafx h main cpp 然后是 A h A cpp B h B c