大型项目的头部保护

Header guards for bigger projects

本文关键字:保护 头部 大型项目      更新时间:2023-10-16

我理解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,这可以加快编译速度并避免循环依赖,但这是另一个问题。

很简单。

您所做的方式是不安全的:如果有一天某人(不一定是您,尽管这是不确定的)直接包含您列出的头之一(尽管这些大多是外部库,但它可能会发展到包括您的一个…),而这个头没有包含警卫?最好尽快排除这个可能的问题!

要构造你的头,你应该包括严格需要的内容,而不是在一个全局头中包含所有内容。

编辑回答:不,你不会包含两次。在第一次包含之后,每个额外出现的头保护文件都将被忽略。