我目前正在使用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>
这是构建我的代码的非常不洁净和低效的方法吗?因为这就是我自己教导自己做事的原因,并且由于某种原因现在看它看起来很狡猾,如果这不是一个好的做法,有人可以解释为什么我不应该这样做吗?
答案 0 :(得分:5)
这是可行的,但它有两个缺点,假设您使用构建系统将每个.cpp
文件编译为其自己的.o
文件,并且稍后将这些文件链接到可执行文件中。
每次pd.h
文件更改时,都需要重新编译所有包含文件。这意味着当您更改此标头时,必须重新编译整个项目。如果您知道这个文件不会经常更改,那么对于一个小项目来说这不是一个很大的缺点。
每个.cpp
文件的构建时间都会增加,因为所有这些头文件都需要处理,即使它们不需要也是如此。编译器可以预编译头文件(check out for VS),但这不是ISO C ++标准的一部分。不包括未使用的标题是一种更易于使用和更好扩展的方法。
可执行文件的大小不会改变,也不会改变生成的应用程序的性能。只是编译时间增加了。
所以只有当你真正需要它时才有包含。将它放在.cpp
文件中是否足够?这样做。只有当它需要包含在头文件中时,才这样做。
有时你只能逃避前瞻性声明。当编译器不需要知道对象的大小时就是这种情况,因为您只是在当前头中定义了指向它的指针。
当你使用某些东西时,这就是我要尝试的顺序:
标题iosfwd
具有iostream
标题的前向声明,如果您只为类提供operator<<
的重载,这可能会有所帮助。这些只需要std::ostream &
,因此编译器不需要知道大小。