我知道什么是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"。但是我意识到这不是一个很好的解决方案,因为如果我想添加一个简单的include怎么办?
是的,我可能会在这个文件中写下我所有的内容,但是我也不确定这是不是一个好主意。
你能推荐我如何组织我的头卫吗?你能给我推荐一些资源吗?
更新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(){
//...
}我不是在main中包含了两次#include <glm/glm.hpp>吗?
发布于 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包含您需要的内容,这可以加快编译速度并避免循环依赖,但这是另一个问题。
发布于 2013-05-17 20:45:09
很简单。每一个标题都有标题守卫。
你这样做的方式是不安全的:如果有一天某人(不一定是你,尽管这是不确定的)直接包括你列出的一个头文件(虽然这些似乎主要是外部库,但它可能演变成包括你的一个...),而这个头文件没有包含防护怎么办?最好尽快排除这个可能的问题!
要构造标头,您应该倾向于在一个全局标头中包含严格需要的内容,而不是所有内容。
编辑答案:不,您不会包含它两次。在第一次包含之后,每个额外出现的头保护文件都将被忽略。
https://stackoverflow.com/questions/16609352
复制相似问题