对于include guards,推荐的命名约定是什么?

zvms9eto  于 2023-10-16  发布在  其他
关注(0)|答案(9)|浏览(158)

通常如何命名包含守卫?我经常看到这样的情况:

#ifndef FOO_H
#define FOO_H

// ...

#endif

然而,我不认为这是非常直观的。如果看不到文件名,就很难分辨FOO_H是用来做什么的,以及它的名字指的是什么。
什么是最佳实践?

vzgqcmou

vzgqcmou1#

我个人遵循Boost的建议。它可能是最大的高质量C++库集合之一,它们没有问题。
它是这样的:

<project>_<path_part1>_..._<path_partN>_<file>_<extension>_INCLUDED

// include/pet/project/file.hpp
#ifndef PET_PROJECT_FILE_HPP_INCLUDED

即:

  • 法律的(注意,以_[A-Z]开头或包含__不是)
  • 容易产生
  • 保证在一个项目中是唯一的(作为一个包含保护)(否则你在同一个地方有两个文件)
  • 保证不会被用于其他任何事情(如果你用INCLUDED结束另一个宏,你会被战斗宠坏)

我读过关于 bat 侠的书,但那些看起来很奇怪。
显然,我宁愿所有编译器都实现#pragma once(或者更好,#pragma multiple和“一次”是默认行为...)

von4xj4u

von4xj4u2#

根据我自己的经验,惯例是在包含它们的头文件之后命名包含保护,例外的是名称都是大写的,并且用下划线替换句点。
所以test.h变成了TEST_H
真实的例子包括Qt Creator,它在自动生成类头文件时遵循这个约定。

68de4m5k

68de4m5k3#

直接摘自谷歌的风格指南:
所有的头文件都应该有#define保护,以防止多重包含。符号名称的格式应该是_H_。为了保证唯一性,它们应该基于项目源代码树中的完整路径。例如,project foo中的foo/src/bar/baz.h文件应该有以下保护:

#ifndef FOO_BAR_BAZ_H_
 #define FOO_BAR_BAZ_H_
 ...
 #endif  // FOO_BAR_BAZ_H_

我在自己的项目中使用这种风格。

hxzsmxv2

hxzsmxv24#

看看#include是你的头的代码。
如果它是这样的:

#include "mylib/myheader.h"

mylib/myheader.h已经是唯一的名称。只需大写并替换/ and。与_

#define MYLIB_MYHEADER_H

如果在包含路径上有两个标题,它们相对于包含路径具有相同的名称,则在该级别上已经存在冲突。

zd287kbt

zd287kbt5#

FOO_H替换为FOO_H_INCLUDED,更清晰。

mv1qrgav

mv1qrgav6#

我通常会看看现在是什么时间,然后把它附加到它的末尾,即。FOO_H_248,这是一个额外的预防措施,你永远不会记住它,所以你不需要担心它是神秘的。

xienkqul

xienkqul7#

正如前面提到的,一个非常常见的约定是使用名称的小写版本,并将点替换为下划线:foo. h-> FOO_H
但是,这可能会导致与简单和/或常见名称的名称冲突。出于这个原因,在非空的Visual C C++项目中自动生成的标头(如stdafx. h)会附加一些随机字符串,如:

#ifndef FOO_H__NsknZfLkajnTFBpHIhKS
#define FOO_H__NsknZfLkajnTFBpHIhKS
#endif

http://www.random.org/strings/是一个有用的随机生成器。
此外,如果文件是某个子模块的一部分,或者它的内容位于一个特定的名称空间中,我倾向于将其添加到guard中:

#ifndef SOMECOMPONENT_FOO_H__NsknZfLkajnTFBpHIhKS
#define SOMECOMPONENT_FOO_H__NsknZfLkajnTFBpHIhKS

namespace somecomponent
{
  ...
}

#endif
7d7tgy0s

7d7tgy0s8#

我通常使用FOO_H_INCLUDED_。一些(Microsoft)头文件看起来很像是一个字符串表示,但我从来不需要任何如此复杂的东西。

bqjvbblv

bqjvbblv9#

通常人们通过文件名来执行,这样每个文件的代码只被编译和添加一次。您可以随意使用FOO_H,但我所编写或看到的几乎所有代码都使用该文件名。只要确保它是唯一的,因为您不希望您的FOO_H与其他人的FOO_H冲突。

相关问题