用于包括警卫的名称?

Names used for include guards?

人们在为其 include guard 选择名称时是否倾向于遵循任何准则?我不明白为什么 .h 文件的名称与 include guard 中使用的名称略有不同。比如我看到了sphere.h然后是#ifndef SPHERE_H_。我可以很容易地使用 SPHERE_ 还是名称必须匹配?下划线也是必须的吗?

要为头球后卫取一个好名字,请考虑以下几点:

1) 名称必须是唯一的,所以要长而具体。这通常可以通过包括项目名称、模块名称、文件名和文件扩展名等内容来完成。

2) 确保您不使用为实施保留的名称。因此,以下划线开头后跟大写字母的名称、包含双下划线的名称、以 _t 结尾的名称以及其他一些名称都已过时。

3) 使名称对人类读者有意义。所以不要只生成一个 UUID 并使用它。

4) 约定要求您使用全部大写的宏来区别于普通变量。

不需要下划线本身,但由于您不能在宏名称中使用空格,因此下划线可以很好地替代保持可读性。

因此,恕我直言,项目 baz 内子模块栏中文件 foo.h 的一个好的保护名称是: BAZ_BAR_FOO_H 。

大多数现代编译器都支持可以替代使用的 #pragma once 指令。参见:https://en.wikipedia.org/wiki/Pragma_once

用于包含保护的符号的重要之处在于它们是唯一的。这意味着不仅每个 header 文件(包括您的项目可能使用的任何库 headers)的 include guards 都需要是唯一的,它们也不能与任何其他在任何地方使用的符号冲突你的项目。

人们有几种常见的方式来确保唯一性:

1) 使用类似 <PROJECT_NAME>_<FILE_NAME> 的内容(即 MYPROJECT_SPHERE_H

包含您的项目名称将有助于确保您的包含防护不会与您从某些库中包含的另一个 "sphere.h" 冲突。使用文件名和扩展名可以在向项目添加新的 header 时轻松创建包含防护,并且名称不太可能在项目的其他任何地方使用(用于变量、函数等) .

2) 使用 UUID(即 GUARD_0be96322_7238_49d2_a967_e8fd9907cca1

这是一种非常安全的方法,因为 UUID 不太可能发生冲突。虽然它更难阅读,并且意味着您必须在每次创建新文件时挖掘出您的 UUID 生成器。