大型项目的头部保护
Header guards for bigger projects
我理解header guard是什么,但我从未见过它是如何在更大的项目中使用的。我目前正在编写一个OpenGL抽象层,我主要需要包含相同的文件。
所以我的第一个天真的方法是这样做的:
#ifndef GUARD_H
#define GUARD_H
#include <glm/glm.hpp>
#include <glm/gtc/matrix_transform.hpp>
#include <glm/gtc/type_ptr.hpp>
#include <GL/glfw3.h>
#include <glload/gl_core.h>
#include <glload/gll.h>
#endif // GUARD_H
我可以用#include "guard.h"
。但我意识到这不是一个很好的解决方案因为如果我想添加一个简单的包含怎么办?
是的,我可能会写我所有的包含在这个文件中,但我也不确定这是不是一个好主意。
你会建议我如何设计我的头部防护?你能给我推荐一些资源吗?
更新1:小示例
test.h
#ifndef TEST_H
#define TEST_H
#include <glm/glm.hpp>
class test{
};
#endif
test1.h
#ifndef TEST1_H
#define TEST1_H
#include <glm/glm.hpp>
class test1{
};
#endif
现在我在测试类中包含了glm。但是如果我想做这样的事情呢?
#include "test.h"
#include "test1.h"
int main(){
//...
}
我不包括#include <glm/glm.hpp>
2次在主?
将所有包含在一个文件中并不是一个好主意,除非您总是包含所有这些文件。
你应该只包括严格的最低要求的头在你自己的头,包括其余的直接在你的.cpp
源文件。
你的每个头应该有一个唯一的头保护,不与任何其他库冲突,所以要非常注意命名方案。
如果您不编写可移植代码,您也可以考虑使用非标准的#pragma once
指令。
你可以看看这篇关于设计头文件的最佳实践的文章
回复您的编辑:
不,你不包含<glm/glm.hpp>
两次,因为它本身有一个标题保护。但是,只有当实际上需要在标题中包含glm.hpp
时,您才应该包含它,否则您应该稍后包含它。请注意,通常可以通过前向声明所需要的内容来避免include,这可以加快编译速度并避免循环依赖,但这是另一个问题。
很简单。
您所做的方式是不安全的:如果有一天某人(不一定是您,尽管这是不确定的)直接包含您列出的头之一(尽管这些大多是外部库,但它可能会发展到包括您的一个…),而这个头没有包含警卫?最好尽快排除这个可能的问题!
要构造你的头,你应该包括严格需要的内容,而不是在一个全局头中包含所有内容。
编辑回答:不,你不会包含两次。在第一次包含之后,每个额外出现的头保护文件都将被忽略。
- 有充分的理由在h文件中使用include保护而不是cpp文件吗
- 为什么在保护模式下继承升级不起作用
- 访问被拒绝后,c++中的故障保护代码
- C++:无法访问声明的受保护成员
- 为什么您需要C++头文件的包含保护
- lock_guard是否保护返回值
- 如何在GTK程序运行时禁用屏幕保护程序/电源管理/屏幕消隐
- 继承和友元函数,从基类访问受保护的成员
- 为什么派生类的好友不能使用受保护的成员?
- C++:为什么无法在派生类中访问受保护的构造函数?
- 公共/私有/受保护是否会更改内存中结构的排列?
- 所以我正在为我的学校作业练习继承,但我无法正确实施标题保护
- C2011: 'Card':"类"类型重新定义(尽管使用了包含保护并且没有在文件中重新定义.cpp类)
- 在父类中公开受保护的构造函数
- 如何从其他结构访问受保护的结构变量
- C++标头保护语法和标头放置
- 如何实现返回受保护结构的私有函数
- 相同的层次结构,访问基类的受保护成员时的行为不同
- 使用标头保护的多个定义链接错误
- 大型项目的头部保护