更大项目的标题保护

时间:2013-05-17 12:42:45

标签: 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

所以我可以做#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次吗?

2 个答案:

答案 0 :(得分:6)

所有包含在一个文件中并不是一个好主意,除非总是包含所有那些文件。

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

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

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

您可以查看this paper about the best practice for designing header files

要回答您的修改:

不,你不包括<glm/glm.hpp>两次,因为它本身就是一个标题保护。但是,只有当实际上需要glm.hpp在标题中时才应包含它,否则您应该稍后再包含它。请注意,您通常可以避免使用forward-declaring所需的内容,这可以加快编译速度并避免循环依赖,但这是另一个问题。

答案 1 :(得分:3)

简单。 每个标题中的标题保护

你做这件事的方式是不安全的:如果有一天某人(不一定是你,虽然这不确定)会直接包含你列出的一个标题(尽管这些主要是外部库,但它可能会演变为包括你的一个...),这个标题没有包括警卫?不妨尽快排除这个可能的问题!

要构建标题,您应该更喜欢在一个全局标题中包含严格需要的内容而不是所有内容。

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