定义带和不带INCLUDED_HEADERNAME_H的标头有什么区别
Whats the difference between defining headers with and without INCLUDED_HEADERNAME_H
所以我正在清理其他人编写的一些代码,我偶然发现了一些我不完全理解的与标题相关的定义。
例如,根据我的经验,在定义我自己的头文件时,以下内容一直是首选语法......
#ifndef SOMEFILE_H
#define SOMEFILE_H
但是,当我浏览这段代码时,我看到了一些略微相似但明显不同的东西......
#ifndef INCLUDED_SOMEFILE_H
#define INCLUDED_SOMEFILE_H
包含部分有什么用途?程序员在什么情况下想使用后来的格式?
包含部分有什么用途?
它有助于避免名称冲突。这些中使用的标识符没有什么神奇之处,包括警卫;您需要的是一致性。要求基本上是:
- 对
#ifndef
和#define
使用相同的标识符。 - 不要在程序的其他任何地方使用该标识符(外部注释 - 在第三个位置使用此标识符有一个合理的约定:
#endif
行上的注释(。
第一个要求是你的困惑(可能(来自哪里。您可能认为标识符必须是所有大写字母的文件名,句点替换为下划线。并非如此。绝对可以使任何标识符起作用。你甚至可以使用类似的东西
#ifndef I_LIKE_SEE_PLUS
#define I_LIKE_SEE_PLUS
但不建议这样做,因为它会导致程序员感到困惑(强调那些略读这个答案的人(。
第二个要求大概是有人在你查看的代码中使用"INCLUDED_
"的原因。该编码人员可能是在命名约定下工作的,其中每个包含保护标识符都以"INCLUDED_
"开头,而没有其他标识符以此开头。根据此约定,包含保护标识符在其他地方意外使用的可能性很小。
话虽如此,这种惯例可能有点矫枉过正。一个更简单且通常有效的约定是指定包含保护标识符的结尾:"_H
"或"_HPP
"或文件命名约定指定的任何内容。意外违反这个约定的可能性比矫枉过正的可能性更大,但仍然不太可能。
程序员在什么情况下想使用后来的格式?
为您的项目选择一个约定并坚持下去。使用适合您(以及您的团队,如果有的话(的东西。
相关文章:
- 向量 <int> a {N, 0} 和 int arr a[N] = {0} 的时间复杂度有什么区别
- 在 .h 文件中的类中声明静态变量和在.cpp文件中声明"global"变量有什么区别
- 我是C++编程的新手,这些代码之间有什么区别,我应该使用哪一个
- 返回常量对象引用 (getter) 和仅返回字符串有什么区别?
- Qt:remove() 和 rmdir() 有什么区别
- 这 4 个 lambda 表达式之间有什么区别?
- 将向量作为类>(值)<向量启动和向量<类>[值]有什么区别
- typedef 枚举和枚举类有什么区别?
- &C::c 和 &(C::c) 有什么区别?
- ascii 和 unicode 在处理级别有什么区别吗?
- C 中的常量限定符和 C++ 中的常量限定符有什么区别?
- "ABC" 和 "ABC" ) 在C++中有什么区别?
- 空指针常量 (nullptr)、空指针值和空成员指针值之间有什么区别?
- 引用捕获和在 lambda 中通过引用发送参数有什么区别 (C++)
- 两种访问I2C总线的方法有什么区别?
- 两种模板示例有什么区别?
- 这两种C++语法之间有什么区别?
- lua 5.0.2 模块和 5.3.5 有什么区别?
- C++中"typedef"、"using"、"namespace"和"using namespace"有什么区别?
- std::enable_if 和 std::enable_if_t 有什么区别?