定义带和不带INCLUDED_HEADERNAME_H的标头有什么区别

Whats the difference between defining headers with and without INCLUDED_HEADERNAME_H

本文关键字:什么 区别 HEADERNAME INCLUDED 定义      更新时间:2023-10-16

所以我正在清理其他人编写的一些代码,我偶然发现了一些我不完全理解的与标题相关的定义。

例如,根据我的经验,在定义我自己的头文件时,以下内容一直是首选语法......

#ifndef SOMEFILE_H
#define SOMEFILE_H

但是,当我浏览这段代码时,我看到了一些略微相似但明显不同的东西......

#ifndef  INCLUDED_SOMEFILE_H
#define  INCLUDED_SOMEFILE_H

包含部分有什么用途?程序员在什么情况下想使用后来的格式?

包含部分有什么用途?

它有助于避免名称冲突。这些中使用的标识符没有什么神奇之处,包括警卫;您需要的是一致性。要求基本上是:

  1. #ifndef#define使用相同的标识符。
  2. 不要在程序的其他任何地方使用该标识符(外部注释 - 在第三个位置使用此标识符有一个合理的约定:#endif行上的注释(。

第一个要求是你的困惑(可能(来自哪里。您可能认为标识符必须是所有大写字母的文件名,句点替换为下划线。并非如此。绝对可以使任何标识符起作用。你甚至可以使用类似的东西

#ifndef I_LIKE_SEE_PLUS
#define I_LIKE_SEE_PLUS

但不建议这样做,因为它会导致程序员感到困惑(强调那些略读这个答案的人(。

第二个要求大概是有人在你查看的代码中使用"INCLUDED_"的原因。该编码人员可能是在命名约定下工作的,其中每个包含保护标识符都以"INCLUDED_"开头,而没有其他标识符以此开头。根据此约定,包含保护标识符在其他地方意外使用的可能性很小。

话虽如此,这种惯例可能有点矫枉过正。一个更简单且通常有效的约定是指定包含保护标识符的结尾:"_H"或"_HPP"或文件命名约定指定的任何内容。意外违反这个约定的可能性比矫枉过正的可能性更大,但仍然不太可能。

程序员在什么情况下想使用后来的格式?

为您的项目选择一个约定并坚持下去。使用适合您(以及您的团队,如果有的话(的东西。