You are on page 1of 2

""! 福 建 电 脑 !

""#年第 $ 期

基于 !"# 的全局变量管理的实现
林 云 夏明伟 罗昔军
!中南大学现代教育技术中心 湖南 长沙 !"##$% "

!摘 要 " 主要讨论了如何利用 & 语言的 ’() ! 标准模板库 " 技术实现大型应用系统中全局变量的统一管理 #


!关键词" 标准模板库#全局变量

$ 引言 &’%’ 内存管理机制
全局变量是应用系统内部数据处理! 业务控制的重要手段 注册时保存对象实例的指针和对象的相关信息 &数组行!列
和方法 " 虽然当今流行的 %&’& 开 发 工 具 已 明 确 表 示 不 支 持 " 但 个数 ! 对象长度 ! 访问名字等 ’" 并根据数据类型和数组长度创建
以 ()(** 为代表的传统开发工具依然支持并广泛运用了 这 种 方 &使用 :1E 方法’两份对象实例"一份作为初始化值存储"初始化
法 # 目前 " 大型应用系统中通常包含多个模块化的子系统 " 各子 数据时将初始化值赋给对象实例 % 另一份作为数据存储 " 保存指
系统相互独立"通过主运行系统进行协调"达到相互通信和数据 向数据缓存区的地址指针"以后通过该指针访问数据%对数据操
传输的目的 $ 然而 " 子系统中各自定义的全局变量只能在本子系 作 & 读取 " 修改 ’ 时根据访问名字取得对象信息 " 根据对象实例的
统中使用"而无法被其他子系统所用%主运行强行定义的全局变 指针操作对象实例$
量"虽可在子系统中使用"但无法达到统一管理的目的$ &’&’ 设计实现
本文将利用 (** 的 +,- 技术统一管理系统中的所有全局变 由于变量的数据类型的多样化 " 包括简单数据类型和复杂
量"包括全局变量的定义 ) 注册&包括内存分配’!初 始 化 !访 问 和 数据类型以及自定义类" 在具体实现时不可能为每一种数据类
注销 & 内存回收 ’$ 型提供一套操作接口函数 $ 因此 " 本文利用 (** 的 +,- 模板方式
% 总体设计 提供对外接口函数"从而支持数据类型的泛型化"以及模板类型
全局变量的统一管理就是要求统一管理各全局变量所使用 的全 局 变 量 &如 (4.59:; !’17.D5K9:.L 等 ’$ 以 下 的 程 序 实 例 采 用 示
的内存"并对外提供统一的访问接口$ 因此"本模型对外提供了 意方式列出主要程序块" 并以一维数组为例分别说明全局变量
全局变量的定义 ) 注册!初始化!访问和注销等接口 "并 采 用 注 册 的注册!初始化!访问和注销"每类函数模板都有一个函数原型"
表方式以名字访问 " 注册表的内容包含名字 ! 类型 ! 初始化值 ! 数 其他函数都由这些原型重载或变种而来 $
组最大下标!存储缓存区地址等信息$ 下面详细介绍各访问接口 FM 初 始 化 全 局 变 量 注 册 表 (直 接 使 用 外 部 定 义 的 注 册 表 变
的设计目标 $ 量$
"* 注册 + 定义全局变量 ’D92 N:9.OHC1;P’17.D5K+,?J,CL G’J.5Q
8
! 支 持 多 种 数 据 类 型 (简 单 类 型 &如 数 字 ! 字 符 ! 字 符 串 !
’?0.5 R ’J.5=
指针等 ’" 复杂类型 & 如结构 ! 模板类和自定义类 ’%
I
! 支持二维数组形式的全局变量% !M 注册一个全局变量(注册时提供三个函数模板"分别用于
! 维护全局变量注册表 & 即在其中增加一条记录 ’% 注册 ) 单个变量 & 包括 ( 简单类型 ! 复杂类型和自定义类 ’*!) 一维
! 对已经注册的全局变量进行内存分配% 数组*!)二维数组*" 其中需要特别注意的是在注册一维数组和
,* 初始化全局变量 二维数组时 " 因无法利用 +,- 取得数组的实际长度从而无法判
! 对已经创建的全局变量的值进行初始化% 断是否越界"因此数组的实际长度必须和输入长度一致 "否则会
! 通过注册表中的初始化值进行赋值% 导致越界错误$
-* 访问全局变量 )) 注册一维数组&单个变量也可适用"列个数为 F 即可’
! 对全局变量的访问支持引用和值两种方式"支 持 并 发 操 .1<0@&.1 K7@&44 ,L
作 " 实现互斥功能 % 9:. C1;94.15OHP,G ES 49>1?. :6<A15B3(D@6<4S4.59:; :&<1Q
8
! 可 分 别 获 取 一 个 全 局 变 量 的 全 部 值 !某 个 值 &仅 对 数 组
)) 名字的合法性检测
形式’!存储地址!某个值的存储地址&仅对数组形式’% MMM
! 可 分 别 修 改 一 个 全 局 变 量 的 全 部 值 !某 个 值 &仅 对 数 组 )) 增加名字
形式’% +,?J,C 0.5=
!* 注销全局变量 0.5M:&<1 R :&<1= 0.5M@1: R 49>1D3P,Q=
0.5M:6<A15B3CDE4 R F= 0.5M:6<A15B3(D@6<4 R :6<A15B3(D@6<4=
! 维护全局变量注册表&即删除一条记录’%
)) 增加对象&:1E 两份实例’
! 回收该全局变量所占用的内存 % , G.1<0 R P, GQP:1E ,T:6<A15B3(D@6<4UQ=
& 实现方案 , G9:9.H&@61 R P, GQP:1E ,T:6<A15B3(D@6<4UQ=
&’$’ 数据结构 )) 赋值
整个全局变量管理的核心是 ) 注册表 *" 采用名字方式访问 " 3D5 P 49>1?. V R "= V K :6<A15B3(D@6<4= V** Q
.1<0TVU R ETVU= 9:9.H&@61TVU R ETVU=
并保存了已注册全局变量的基本信息和数据缓冲区地址指针$
0.5M0.5 R .1<0= 0.5M9:9.H&@61 R 9:9.H&@61= 0.5M./01 R "=
以下是注册表结构定义和说明 ( ’?0.5WL064X?A&7YP0.5Q=
./01213 4.567. 8 51.65: "=
4.59:; :&<1= )) 访问名字 I
49>1?. @1:= )) 参数长度"用于取数据+保存数据时的类型
ZM 初 始 化 一 个 全 局 变 量 (从 注 册 表 中 获 取 初 始 化 变 量 地 址
参数判断长度是否匹配
数组行个数
指针和全局变量地址指针 " 通过指针将初始化变量数据附值给
49>1?. :6<A15B3CDE4= ))
49>1?. :6<A15B3(D@6<4= )) 数组列个数 全局变量$ 由于初始化时对一维数组和二维数组只需要数组的
9:. ./01= )) 类型标志&"(一维%F(二维’ 数据类型 " 因此所有类型全局变量使用相同的初始化函数模板 $
’D92 G 9:9.H&@61= )) 初始化值缓存区指针 )) 初始化全局变量
’D92 G 0.5= )) 数据缓存区指针 .1<0@&.1 K./01:&<1 ,L
I +,?J,C= 9:. N:9.OHP,[S 4.59:; :&<1Q !下转第 "", 页"
00, 福 建 电 脑 !""#年第 $ 期

-6</*,)?A1-)?Q)?1/]1’^?R)+8 为 ‘6B 命名空间添加 Y6<)*1, 语句"


$%& ’()%*+, 与 -./ 的结合 Y6<)*1, TN,1/6’‘6B
然后添加 ‘6BZA1AZ)FC6/?1 的窗体级变量声明"
如今有许多查看和使用数据的方法 # 传统上 ! 我们使用诸如
U*-;A1/ ]6BZ)F I, ‘6BZA1AZ)FC6/?1
IZP’_[9 这样的数据 访 问 技 术 ! 这 种 技 术 为 我 们 提 供 了 主 要 通过相关联的数据集将一个 ‘a\ 文档加载到 ‘6BZA1AZ)FC6/?1 的过程"
针对关系数据的强大功能# 利用 IZP’_[9 !可以实现与非 关 系 **
数据的交互 ! 但真正的焦点是传统的表格式数据视图 ! 在人事管 Z,U/*,’QB/A*+8
理系统中尤为常见# ]6BZ)F 3 _/K ‘6BZA1AZ)FC6/?1+Z,U/*,8
‘a\ 这种技术的核心是 分 层 数 据 表 示 形 式 ! 可 以 说 是 层 次 ]6BZ)F’\)AR+XFcd</*,)? ON SA?R’]6BX8
**
数据库概 念 的 开 放 表 示 形 式 !但 因 为 ‘a\ 是 基 于 文 本 的!能 够
首先我们要清除数据集!以确保它不包含任何数据# 然后将
利用 ‘T\ 应用转换!再加上其他与 ‘a\ 相关的标准!它在可扩
ZA1AT/1 对象链接到一个新的 ‘6BZA1AZ)FC6/?1 对象 # 此 时 ! 我
展性和表现能力方面远远超出层次数据库 #
们 加 载 到 ‘6BZA1AZ)FC6/?1 的 任 何 数 据 都 将 反 映 在 数 据 集 中 #
利用 IZP’_[9 !a-F*),)(1 不仅 提 供 对 关 系 数 据 源 中 的 传 统
也就是说!是与定义数据集的 ‘TZ 相匹配的任何数据# 由于我
表 格 式 数 据 视 图 的 支 持 ! 而 且 还 集 成 了 对 ‘a\ 的 强 大 支 持 #
们 使 用 的 是 R,U/*, ! 我 们 知 道 它 有 一 个 相 关 联 的 ‘TZ ! 该 ‘TZ
IZP’_[9 和 ‘a\ 之 间 的 关 系 以 若 干 个 级 别 存 在 于 基 础 结 构
涵盖了我们一直在使用的数据#
中! 因此我们可以基于自己的应用程序要求以灵活的方式使用
利用 IZP’_[9 和 ‘6BZA1AZ)FC6/?1! 我们很好地将这两 者
这两种数据技术#
结合起来# 我们可以执行直接从数据集读写 ‘a\ 的基本操作!
IZP’_[9 本身可分为两个部分# 一部分是托管提供 程 序 !
当 ‘a\ 变得更加复杂时!我们可以通过一个链接的数据集将它
负责处理与数据源的通讯 # 另一部分是数据集 ! 为表格式数据提
加载到 ‘6BZA1AZ)FC6/?1! 这样就可以 同 时 获 得 数 据 的 ‘a\ 和
供内存中的存储区# 数据集可以加载来自托管提供程序的数据!
表格视图#
或者可以直接从我们的代码加载# 另外!数据集也可以通过使用
! 小结
‘6BV/AR/* 加载数据# 上述内容如图 b 所示#
我 们 描 述 了 一 个 基 于 ITU’_[9 !IZP’_[9 和 ‘a\ 相 结 合
的 e/O 人事管理系统的设计原理$总体结构及功能 实 现 # 在 系
统使用过程中我们还将进一步对其进行功能扩充和改进# 用
ITU’_[9 技 术 开 发 基 于 e[f 的 aYT 近 年 非 常 热 门 ! 随 着 时 间
推移 L 预计该项技术还将得到更为广泛的应用 #

参考文献!
!0# 56789:; <=;>:?@= "A:69= B:9=76? "等 C<DECFGH 0C’ 高级编程 !I#C
北京# 清华大学出版社"&’’&
!&# ! 美 # 狄金森"等 C<JKCFGH 高级编程 !I#C 北京#清华大学出版社",’’L
!L# E>M:@NM?@? "等 )O6?N9P A9?67)FGH 数据库编程从入门到精通!I#) 北京#
图 b 向数据集加载数据的三种方式 电子工业出版社",((,
!Q# 陈旭"张学杰 ) 基于 <DE)FGH 技术的 R>S 人事管理信息系统的设计
UCOB-F QBA,, R,U/*, 与实现 !T#) 计算机应用研究",((Q+00-
Y?S/*-1, ZA1AT/1 !U# 叶德谦"马勤勇 ) 使用 <JK)FGH 对关系数据库的访问 !T#) 微型电脑应
** 用",((0+V-
[?R QBA,,

!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

+ 上接第 00Q 页 -
% !"#" 使用说明
&& 在注册表中找到该名字!并进行数据类型 所 有 的 结 构 定 义 和 函 数 模 板 都 包 含 在 ’HB)OAB@A*’S (中 !而
’’’
()* + ,-./01 2 3 "4 2 5 64 277 8
’HB)OAB@A*’F<<( 中 仅 包 含 注 册 表 的 定 义 " ’;/F1)* 5T90U9V G
++9 :8+:;0<1*8=->’<1*8=2> 3 ++9 :8+:;0<1*8=->’-?-1@ABC/8=2>4 :;0<1*4 ()
’’’ 在应用中凡是需要使用全局变量时 !使用前必须 W-?FBCR/ X
D HB)OAB@A*’SX ! 并 在 应 用 的 工 程 中 包 含 HB)OAB@A*’F<<) 并 在 各 子
E’ 访 问 一 个 全 局 变 量 "从 注 册 表 中 获 取 全 局 变 量 数 据 缓 冲 系 统 创 建 时 调 用 初 始 化 全 局 变 量 注 册 表 函 数 Y?-1H@V/M+,1ZB!
区地址指针 ! 通过指针读取和修改数据内容 # 采用不同函数模板 B[?1*N’<,1HB)OAB@A*8#
的方式提供丰富的访问接口! 如读取和修改一个全局变量的全 # 结束语
部 值 $一 个 全 局 变 量 的 某 个 值 $一 个 全 局 变 量 的 存 储 地 址 $一 个 本文从应用系统的角度介绍了全局变量管理的意义和模型
一维全局变量的某个值的存储地址等# 实现方法 # % 大型 & 应用系统要适应企业的应用要求 ! 保持强大的
&& 获取一个全局变量的某个值 生命力!就必须关注于业务逻辑的实现!而将系统的架构和通用
1/6<BA1/ 5FBA,, 9G
-?1 H/1IH@+9 JKL ,-./01 *)K,L,-./01 F)BC6,L,1*-?M ?A6/L -?1 A**AN8
模块交由外围模块实现 ! 从而解放开发人员的负担和关注点 # 本
% 文正是在这种思想的指导下! 提出了基于 T9\ 技术的全局变量
&& 在注册表中找到该名字!并进行数据类型和数组越界检测 管理模型!希望它能为那些应用项目子系统多 $系统各模块集成
’’’ 差的企业应用提供良好的解决方案 #
K 3 ++9 :8+:;0<1*8=->’<1*8=*)K,:+:;0<1*8=->’?C6O/*P(Q)BC6,7F)BC6,>4
’’’
D
参考文献 !
#’ 注销一个全局变量"从注册表中获取地址指针!作类型转 !"# 钱能! $%% 程序设计教程! 清华大学出版社"&’(")* "+,(- !
换后 R/B/1/ 该变量!并将其从注册表中清除%/*A,/&# !,# 张春晖"刘大庆"等译! ./.%% 程序员实用大全! 中国水利水电出版
社"011234

You might also like