首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >大型项目的标题保护

大型项目的标题保护
EN

Stack Overflow用户
提问于 2013-05-17 20:42:45
回答 2查看 147关注 0票数 1

我知道什么是header guard,但我从未见过它在更大的项目中是如何使用的。我目前正在编写一个OpenGL抽象层,并且我主要需要包含相同的文件。

所以我的第一个天真的方法是这样做:

代码语言:javascript
复制
#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"。但是我意识到这不是一个很好的解决方案,因为如果我想添加一个简单的include怎么办?

是的,我可能会在这个文件中写下我所有的内容,但是我也不确定这是不是一个好主意。

你能推荐我如何组织我的头卫吗?你能给我推荐一些资源吗?

更新1:小示例

代码语言:javascript
复制
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。但是如果我想做这样的事情呢。

代码语言:javascript
复制
#include "test.h"
#include "test1.h"
int main(){
//...
}

我不是在main中包含了两次#include <glm/glm.hpp>吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-05-17 20:46:56

将所有的包含文件放在一个文件中并不是一个好主意,除非您总是包含所有这些文件。

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

您的每个头文件都应该有一个唯一的头保护,而不会与任何其他库冲突,因此要非常小心地注意命名方案。

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

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

要回答编辑问题,请执行以下操作:

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

票数 6
EN

Stack Overflow用户

发布于 2013-05-17 20:45:09

很简单。每一个标题都有标题守卫。

你这样做的方式是不安全的:如果有一天某人(不一定是你,尽管这是不确定的)直接包括你列出的一个头文件(虽然这些似乎主要是外部库,但它可能演变成包括你的一个...),而这个头文件没有包含防护怎么办?最好尽快排除这个可能的问题!

要构造标头,您应该倾向于在一个全局标头中包含严格需要的内容,而不是所有内容。

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

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16609352

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档