gpt4 book ai didi

c++ - 全局包含的预定义 header

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:42:01 26 4
gpt4 key购买 nike

我目前正在用 C++ 抽象 OpenGL,我只是想知道我正在做的某种实践是否被认为是干净高效的,或者完全相反。我有一个头文件,它包含在几乎每个名为“pd.h”的抽象头文件中,在这个文件中我包含了我的程序所需的一切:

#pragma once
#include <GL/glew.h>
#include <GLFW/glfw3.h>
#include <glm/glm.hpp>
#include <glm/gtc/matrix_transform.hpp>
#include <glm/gtc/type_ptr.hpp>
#include <algorithm>
#include <iostream>
#include <fstream>
#include <string>
#include <sstream>
#include <vector>

这是一种非常不干净且低效的代码结构方式吗?因为这正是我教自己做事的方式,出于某种原因现在看来有点不靠谱,如果这不是一个好的做法,有人可以解释为什么我不应该这样做吗?

最佳答案

这是可行的,但它有两个缺点,假设您使用编译每个 .cpp 的构建系统。文件到它自己的 .o文件,然后才将它们链接到可执行文件中。

  1. 每次您的 pd.h文件更改,包括文件在内的所有文件都需要重新编译。这意味着当您更改此 header 时,您的整个项目必须重新编译。如果你知道这个文件不会经常改变,那么这对于一个小项目来说并不是什么大缺点。

  2. 每个 .cpp 的构建时间都会增加文件,因为所有这些头文件都需要处理,即使它们并不需要。编译器可以预编译 header ( check out for VS ),尽管这不是 ISO C++ 标准的一部分。不包括未使用的 header 是一种更易于使用且扩展性更好的方法。

    可执行文件的大小不会改变,生成的应用程序的性能也不会改变。只是编译时间增加了。

因此,只有在您真正需要时才使用 include。将它放在 .cpp 中就足够了吗?文件?这样做。只有当它需要包含在头文件中时,才这样做。

有时您只需要提前声明就可以逃脱惩罚。当编译器不需要知道对象的大小时就是这种情况,因为您只在当前 header 中定义指向它的指针。

当你使用某些东西时,这是我会尝试的顺序:

  1. 仅在源文件中包含该 header
  2. 在头文件中使用前向声明(可能需要在源文件中保留包含)
  3. 在头文件中包含该头文件

有一个标题iosfwd其中有 iostream 的前向声明header,如果你只是为 operator<< 提供重载,这会很有帮助为你的类(class)。这些只需要 std::ostream &因此编译器不需要知道大小。

关于c++ - 全局包含的预定义 header ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49572458/

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