用于包括警卫的姓名?

时间:2018-05-15 17:15:49

标签: c++ c-preprocessor include-guards

在为包含守卫选择名字时,人们往往会遵循哪些指导原则?我不明白为什么 .h 文件的名称与include guard中使用的名称略有不同。例如,我见过sphere.h,然后是#ifndef SPHERE_H_。我是否可以轻松使用SPHERE_或者名称必须匹配?下划线也是必要的吗?

3 个答案:

答案 0 :(得分:5)

要为头部防守选择一个好名字,请考虑以下几点:

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

2)确保不使用为实现保留的名称。因此,以下划线后跟大写字母开头的名称以及包含双下划线的名称,以_t结尾的名称等等。

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

4)约定规定你使用全部大写的宏来区分它们与普通变量。

下划线不是需要就是这样,但由于你不能在宏名中使用空格,所以下划线是保持可读性的好选择。

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

答案 1 :(得分:2)

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

答案 2 :(得分:0)

用于包括警卫的符号的重要之处在于它们是独一无二的。这意味着,不仅每个头文件的包含保护(包括您的项目可能使用的任何库头)都必须是唯一的,它们也必须不与项目中任何位置使用的任何其他符号冲突。

人们有几种常见的方法来确保独特性:

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

包括您的项目名称将有助于确保您的包含警卫不会与另一个&#34; sphere.h&#34;你包括一些图书馆。使用文件名和扩展名可以在向项目添加新标题时轻松创建包含保护,并且不太可能在项目的任何其他位置使用名称(对于变量,函数等)。

2)使用UUID(即GUARD_0be96322_7238_49d2_a967_e8fd9907cca1

这是一种非常安全的方法,因为UUID 不太可能发生冲突。但是阅读起来比较困难,这意味着你必须在创建新文件时挖掘你的UUID生成器。