C++ 保安的名字?

C++ 保安的名字?,c++,c-preprocessor,include-guards,C++,C Preprocessor,Include Guards,人们在为自己的防护装置选择名称时,有什么指导原则吗?我不明白为什么.h文件的名称与include-guard中使用的名称略有不同。例如,我看到了sphere.h,然后是\ifndef sphere\u h。我可以同样轻松地使用SPHERE\uuu吗?或者名称必须匹配吗?下划线也是必需的吗?< /p> < p>为头保护器取一个好名字,请考虑以下几点: 1) 名称必须是唯一的,所以要长且具体。这通常可以通过包含项目名称、模块名称、文件名和文件扩展名等内容来实现 2) 确保不使用为实现保留的名称。因此

人们在为自己的防护装置选择名称时,有什么指导原则吗?我不明白为什么.h文件的名称与include-guard中使用的名称略有不同。例如,我看到了sphere.h,然后是
\ifndef sphere\u h
。我可以同样轻松地使用
SPHERE\uuu
吗?或者名称必须匹配吗?下划线也是必需的吗?< /p> < p>为头保护器取一个好名字,请考虑以下几点:

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

2) 确保不使用为实现保留的名称。因此,以下划线开头,后跟大写字母的名称将被删除,包含双下划线的名称、以_t结尾的名称以及其他一些名称也将被删除

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

4) 约定要求宏使用全大写,以区别于普通变量

因此,不需要下划线,但由于不能在宏名称中使用空格,因此下划线是保持可读性的良好替代方法


因此,IMHO,在项目baz内的子模块栏中的foo.h文件的一个好的保护名称是:baz_bar_foo_h

大多数现代编译器支持
#pragma once
指令,可以使用该指令。请参阅:

用于包含防护装置的符号的重要一点是它们是唯一的。这意味着,每个头文件(包括项目可能使用的任何库头)的include-guard不仅必须是唯一的,还必须与项目中任何地方使用的任何其他符号不冲突

人们在确保独特性方面有两种常见的方法:

1) 使用类似于
\u
(即
MYPROJECT\u SPHERE\u H

包含您的项目名称将有助于确保您的include guard不会与您从某个库中包含的另一个“sphere.h”的名称冲突。使用文件名和扩展名可以在向项目中添加新标题时轻松创建include-guard,并且不太可能在项目中的任何其他位置(对于变量、函数等)使用该名称

2) 使用UUID(即
防护装置\u 0be96322\u 7238\u 49d2\u a967\u e8fd9907cca1


这是一种非常安全的方法,因为UUID极不可能发生碰撞。但是,它更难阅读,这意味着无论何时创建新文件,都必须挖掘UUID生成器。

至少,不要使用包含双下划线的名称或以下划线开头并后跟大写字母的名称-两者都是保留的。下划线不是必需的,但不要在开头使用一个,也不要在任何地方连续使用两个。关于这一点的更多信息,这里不称为
#ifndef
,而是用作头保护或包含保护,用于使用GUID,例如
H123e4567_e89b_12d3_a456;_426655440000
。我有一个小程序,可以批量生产。现在我只使用了一次pragma。投票主要是基于意见的。“JaveDaDeNe:<代码>·γ-语用学曾经可能失败,但不是标准C++。这个pragma还没有标准化,值得注意的是,它还没有标准化,因为有一些突出的情况,
#pragma once
无法处理。一些程序员的编辑器可以生成带有UUID的include卫士。包含UUID的标题卫士很难阅读,并且不能传达任何关于其内容的含义GuID的主要问题是,当有人复制头并修改C++代码而不更新GUID时,它们最终成为Gun-UID。这在实现同级类时并不罕见。@MSalters我不建议使用guid,恰恰相反。