`

避免多重包含

 
阅读更多

在编写头文件之前,我们需要引入一些额外的预处理器设施。预处理器允许我们自定义变量。

预处理器变量的名字在程序中必须是唯一的。任何与预处理器变量相匹配的名字的使用都关联到该预处理器变量。为了避免名字冲突,预处理器变量经常用全大写字母表示。

预处理器变量有两种状态:已定义或未定义。定义预处理器变量和检测其状态所用的预处理器指示不同。#define 指示接受一个名字并定义该名字为预处理器变量。#ifndef 指示检测指定的预处理器变量是否未定义。如果预处理器变量未定义,那么跟在其后的所有指示都被处理,直到出现 #endif

可以使用这些设施来预防多次包含同一头文件:

#ifndef SALESITEM_H

#define SALESITEM_H

// Definition of Sales_itemclass and related functions goes here

#endif

条件指示

#ifndef SALESITEM_H

测试 SALESITEM_H 预处理器变量是否未定义。如果 SALESITEM_H 未定义,那么 #ifndef 测试成功,跟在 #ifndef 后面的所有行都被执行,直到发现#endif 。相反,如果 SALESITEM_H 已定义,那么 #ifndef 指示测试为假,该指示和 #endif 指示间的代码都被忽略。

为了保证头文件在给定的源文件中只处理过一次,我们首先检测 #ifndef 。第一次处理头文件时,测试会成功,因为 SALESITEM_H 还未定义。下一条语句定义了 SALESITEM_H 。那样的话,如果我们编译的文件恰好又一次包含了该头文件。#ifndef 指示会发现 SALESITEM_H 已经定义,并且忽略该头文件的剩余部分。

头文件应该含有保护符,即使这些头文件不会被其他头文件包含。编写头文件保护符并不困难,而且如果头文件被包含多次,它可以避免难以理解的编译错误。当没有两个头文件定义和使用同名的预处理器常量时,这个策略相当有效。我们可以为定义在头文件里的实体(如类)命名预处理器变量来避免预处理器变量重名的问题。一个程序只能含有一个名为 Sales_item 的类。通过使用类名来组成头文件和预处理器变量的名字,可以使得很可能只有一个文件将会使用该预处理器变量。

分享到:
评论

相关推荐

    多重分形时空中的洛伦兹违规

    在带有q导数的所谓多分数理论中,我们表明色散关系的变形比普通的量子引力方法(包括环量子引力)要强得多,并且与后者相反,目前关于GWs的观测可以非常 时空偏离标准Minkowski的特征尺度上的强边界。 当度量中的...

    论文研究 - 两管多重PCR在病理标本中对结核和非结核分枝杆菌进行基因分型

    方法:我们开发了两个多重PCR分析方法,通过检测第一个试管中的IS6110插入片段,将MTC与NTM区分,并通过靶向16S-23S rRNA内部转录间隔子,在第二个试管中区分出多达14个NTM参考菌株。 测试材料包括594例具有不同...

    MPprimer:可靠的多重PCR引物设计程序-开源

    背景:多重PCR定义为在一根试管中使用不止一个引物组(包含正向引物和反向引物)同时扩增DNA模板的多个区域,已被广泛用于临床和环境微生物学研究中。 然而,用于多重PCR的引物设计仍然是一个有挑战性的问题,需要...

    简易混音器编程_音量控制

    一个包含基本混音器操作的类。里面方法都为静态方法,方便使用 功能包括: 读取混音器音量 设置混音器音量 判断混音器是否静音 设置混音器静音 对左右声道设置静音 设置麦克风的输入音量值 其中运行这些static ...

    射流的熵

    散射过程通常不可避免地包括与硬散射事件高度相关的红外状态的产生,并分解硬状态。 可以使用从红外状态追踪获得的硬性降低密度矩阵的熵来描述这一点。 我们通过将希尔伯特空间分为硬态和红外态,来确定渐近自由规范...

    matlab对比实验代码-Image-Dehazing-Using-Multi-exposure-Image-Fusion:基于多重曝光图像融

    matlab对比实验代码使用多重曝光图像融合进行图像去雾 Matlab文章“基于自适应结构分解的人工图像融合方法进行图像除雾”的Matlab源代码摘要:雾度会严重影响室外图像的可见和视觉质量。 作为实践中的挑战,始终使用...

    mfc入门手册

    以下是我在最初学习VC时所常用的开发思路和...7、学会利用子窗口,并在自定义的子窗口包含多个控件达到封装功能的目的。 8、尽量避免使用多文档多视结构。 9、不要使用多重继承并尽量减少一个类中封装过多的功能。

    C++之程序结构,头文件,源代码文件.pdf

    C++之程序结构,头⽂件,源代码⽂件 程序组织策略 程序组织策略 C++中建⽴代码⼯程时,... 注:在IDE中不要将头⽂件加⼊到项⽬列表中,也不要在源代码⽂件中使⽤#include来包含其他源代码⽂件,这样将会导致多重声明。

    mixins:C# Mixins - 创建一个由多个对象和_或属性组合而成的实例。 基本上是一个穷人的多重继承,旨在对象图的序列化和反序列化

    基本上是一个穷人的多重继承,旨在对象图的序列化和反序列化。 有关更多详细信息,请参阅 。 故事 作为Web API 开发人员 我想轻松创建复合对象 这样我就可以避免编写将多个对象映射/转换为一个的繁琐代码。 特别是...

    Use Cases Patterns and Blueprints

    本书内容包括:  ·导致构建更易于理解的、可维护的和正确的模型的建模规则  ·更有效的构造、分层、映射、程序化和观察用例的模式  ·安全性、旧的集成、数据输入/输出、任务安排和报告的蓝图  ·构建从可分别...

    单页应用前端MVC框架Magix.zip

    包括:采取Dom节点即用即释放的方法,保障永不持有Dom节点采用全新的事件代理方案,高效解耦Dom节点与事件响应体Magix 基于“约定大于配置”设计原则,可以快速构建可扩展的大型单页面Web应用,同时也特别注意 ...

    胶质消除的场景

    在非通用MSSM方案中,我们发现参数空间的允许范围受到电弱对称破坏,避免带电LSP的避免以及希格斯玻色子的测量质量的限制,特别是 作为其他暗物质(共)an灭过程的外观。 然而,具有正确暗物质密度的LSP质量mχTe 8...

    C语言程序设计标准教程

    scanf函数是一个标准库函数,它的函数原型在头文件“stdio.h”中,与printf函数相同,C语言也允许在使用scanf函数之前不必包含stdio.h文件。scanf函数的一般形式为: scanf(“格式控制字符串”,地址表列); 其中,...

    12C SQL方面新特性小结

    在12c R1中,只要索引类型的形式不同,一个字段可以包含在一个B-tree索引中,同样也可以包含在Bitmap索引中。注意,只有一种类型的索引是在给定时间可用的。  翻页查询  之前版本中需要借用ROWNUM对查询结果设置...

    超对称破坏引起的膨胀的微观模型

    它包含一个在一定的R-对称性下带电的手性多重峰,该峰在标量势最大时恢复为具有发生充气的平稳状态。 有效场论依赖于两个现象学参数,这些参数对应于对围绕原点的二阶Kähler势的校正。 第一个保证原点处的最大值,...

    动态规划背包问题6篇讲解+源码

    在以下六篇讲解中,我们将深入探讨背包问题的各种变体,包括0/1背包、完全背包、多重背包等,以及如何使用动态规划来解决它们。我们会详细解释动态规划的思路、状态转移方程的设计、以及如何处理边界条件。 同时,...

    01规划背包问题讲解PPT+源码+word

    在以下六篇讲解中,我们将深入探讨背包问题的各种变体,包括0/1背包、完全背包、多重背包等,以及如何使用动态规划来解决它们。我们会详细解释动态规划的思路、状态转移方程的设计、以及如何处理边界条件。 同时,...

    双迹流和沼泽地

    我们介绍了一个可以避免这种情况的具体示例:有限k处的ABJM理论,其变形为∫O 2 $$ {\ displaystyle \ int {\ mathcal {O}} ^ 2} $$,其中O $$ \ mathcal {O} $$是应力张量多重图中的超共形基元。 我们基于弱重力...

    低碳园区能效数字化解决方案(40页).pdf

    该方案通过智能供电、智能节能和智能建筑等多重手段,实现能源的高效利用、碳排放的消除以及企业的绿色发展。 具体来说,零碳智慧园区标准解决方案包括以下几个关键步骤: 智能供电:这是解决方案的第一步,通过...

    ABB零碳智慧园区标准解决方案.pdf

    该方案通过智能供电、智能节能和智能建筑等多重手段,实现能源的高效利用、碳排放的消除以及企业的绿色发展。 具体来说,零碳智慧园区标准解决方案包括以下几个关键步骤: 智能供电:这是解决方案的第一步,通过...

Global site tag (gtag.js) - Google Analytics