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