1

我了解什么是标头守卫,但我从未见过它在更大的项目中是如何使用的。我目前正在编写一个 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次吗?

4

2 回答 2

6

It's not a good idea to put all your includes in one files, except if you always include all those file.

You should only include the strict minimum of required headers in your own headers and include the rest directly in your .cpp source files.

Each of your headers should have a unique header guard without conflict with any other library, so take a very good care of the naming scheme.

You may also consider using the non-standard #pragma once directive, if you're not writing portable code.

You could take a look at this paper about the best practice for designing header files

To answer your edit :

No you don't include <glm/glm.hpp> twice, because it has itself a header guard. But you should include it only if you actually need glm.hpp inside your header, otherwise you should include it later. Note that you can often avoid the include by forward-declaring what you need, that could speed-up the compilation and avoid circular dependency, but that's another issue.

于 2013-05-17T12:46:55.983 回答
3

简单的。在每一个标头中都有标头守卫。

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

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

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

于 2013-05-17T12:45:08.733 回答