Max*_*xpm 22 c++ include-guards c-preprocessor
C++如何包含通常命名的守卫?我倾向于看到这么多:
#ifndef FOO_H
#define FOO_H
// ...
#endif
Run Code Online (Sandbox Code Playgroud)
但是,我认为这不是很直观.如果没有看到文件名,就很难分辨出它的含义FOO_H和名称所指的含义.
什么是最佳做法?
Mat*_* M. 23
我个人遵循Boost的建议.它可能是最好的C++库集合之一,它们没有问题.
它像:
<project>_<path_part1>_..._<path_partN>_<file>_<extension>_INCLUDED
// include/pet/project/file.hpp
#ifndef PET_PROJECT_FILE_HPP_INCLUDED
Run Code Online (Sandbox Code Playgroud)
这是:
_[A-Z]或包含__不是)INCLUDED你正在破坏战斗)我读过关于GUID的内容,但那些看起来很奇怪.
显然,我宁愿所有编译器实现#pragma once(或更好,#pragma multiple"一次"是默认行为......)
Nat*_*man 17
根据我自己的经验,惯例是在包含它们的头文件之后命名包含保护,除了名称全部为大写,并且句点用下划线替换.
因此test.h变得TEST_H.
真实的例子包括Qt Creator,它在自动生成类头文件时遵循此约定.
Mar*_*lon 13
直接来自谷歌的风格指南:
所有头文件都应该有#define防护,以防止多次包含.符号名称的格式应为<PROJECT> _ <PATH> _ <FILE> _H_.为了保证唯一性,它们应该基于项目源树中的完整路径.例如,项目foo中的文件foo/src/bar/baz.h应该具有以下保护:
Run Code Online (Sandbox Code Playgroud)#ifndef FOO_BAR_BAZ_H_ #define FOO_BAR_BAZ_H_ ... #endif // FOO_BAR_BAZ_H_
我在自己的项目中使用这种风格.
查看#include是您的标题的代码.
如果它是这样的:
#include "mylib/myheader.h"
Run Code Online (Sandbox Code Playgroud)
mylib/myheader.h已经是一个独特的名字.只需大写和替换/和.用_
#define MYLIB_MYHEADER_H
Run Code Online (Sandbox Code Playgroud)
如果包含路径上有两个相对于包含路径具有相同名称的标题,则表明您已在该级别发生冲突.