繁体   English   中英

如何在 C++ 的 header 文件中确定适当的条件包含标识符 (#ifndef)?

[英]How to determine the appropriate identifier of conditional inclusion (#ifndef) in header files for C++?

当我创建一个新的 HeaderFile.h 时,我使用的是 IDE 它给了我以下行

#ifndef CODE_HEADERFILE_H

但我也看到了以下用法:

#ifndef _HeaderFile_
#ifndef HEADERFILE_H

如果 header 文件被多次加载,label 是完全任意的吗? 如果另一个不同的 header 文件具有相同的标识符并且两者都包含在某个地方会发生什么?

包括守卫定义命名是个人的,但通常它的形式是

HEADER_FILE_NAME_H

但是你可以选择任何你想要的名字,只要它不与其他包含保护冲突,否则只有 1 个文件最终会被包含。

还有#pragma once ,虽然标准不支持它,但所有主要编译器都支持它。 这消除了一起包含防护的需要。

如何在 C++ 的 header 文件中确定适当的条件包含标识符 (#ifdef)?

与确定任何变量、宏、function 或类型的名称完全相同的方式:

  1. 首先,请查阅语言规则,了解为语言实现保留哪些标识符,不要使用任何这些标识符。

     #ifndef _HeaderFile_

    这是保留标识符的示例。 除非您正在实现标准库,否则不要定义它。

  2. 接下来,排除在程序中用于任何其他目的的任何标识符。 如果您有名为x的变量,则不要将其用作 header 保护。 如果您有一个名为y的 header 防护装置,则不要将其用作另一个 header 防护装置。 如果您有一个名为XYZ_H的 function ,则不要将其用作 header 防护装置。

  3. 现在,从其余名称中选择任何标识符。 应该有很多可供选择的。

label 是完全任意的

只有任何其他变量、宏、function 或类型名称是任意的。 您只需要想出一个唯一的名称。

但是,您无需在任何其他上下文中引用 header 保护宏,因此您无需担心它与程序中的大多数其他名称不同。

如果另一个不同的 header 文件具有相同的标识符并且两者都包含在某个地方会发生什么?

定义 FOO 时ifndef FOO FOO发生什么? 预处理器将删除指令之后的所有内容,直到下一个#endif指令(或#else ,但这在 header 防护装置中很少见)。 这就是 header 防护如何防止多个包含在同一个文件中:预处理器指令将后续包含设为空。 如果多个标头共享同一个保护,则第二个包含的标头将为空。 这可能会是一个问题。

也许,这完全取决于您和您的公司或您的团队的代码风格。 当我写#ifdef 或#ifndef 时,通常我会写如下语句: 1) #ifndef HEADERFILE_H 2) #ifndef HEADER_FILE_H 3) #ifndef PATH_TO_YOUR_HEADERFILE_HEADERFILENAME_H

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM