更大项目的标题保护

Mai*_*ein 1 c++

我理解头盔是什么,但我从来没有看到它如何在更大的项目中使用.我目前正在编写一个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
Run Code Online (Sandbox Code Playgroud)

所以我可以做到#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
Run Code Online (Sandbox Code Playgroud)

现在我把glm包含在我的测试类中.但是,如果我想做这样的事情怎么办?

#include "test.h"
#include "test1.h"
int main(){
//...
}
Run Code Online (Sandbox Code Playgroud)

我不是#include <glm/glm.hpp>主要包括 2次吗?

zak*_*ter 6

所有包含放在一个文件中并不是一个好主意,除非您始终包含所有这些文件.

您应该只在自己的标头中包含严格的最小必需标头,并将其余标头直接包含在.cpp源文件中.

每个标头都应该有一个唯一的标头保护,不会与任何其他库发生冲突,因此请非常注意命名方案.

#pragma once如果您不编写可移植代码,也可以考虑使用非标准指令.

您可以查看本文关于设计头文件的最佳实践

要回答你的编辑:

不,你不包括<glm/glm.hpp>两次,因为它本身就是一个头部防守.但是只有当你真正需要glm.hpp在标题中时才应该包含它,否则你应该在以后包括它.请注意,您通常可以通过向前声明所需内容来避免包含,这可以加快编译速度并避免循环依赖,但这是另一个问题.