如安在C++Builder中利用全局变量
副标题#e#
本文具体表明白如安在C++Builder中利用全局变量。
作者:yifei(尹加俊)
如安在C++Builder中利用全局变量?
(1).假如我在一个公用的头文件中界说一个变量,在其它单位中可以直接利用它吗?如下:
//--------------------------------Globals.h----------------------------------
#ifndef GlobalsH
#define GlobalsH
//---------------------------------------------------------------------------
#include <Classes.hpp>
//---------------------------------------------------------------------------
AnsiString UserName;
//---------------------------------------------------------------------------
#endif
谜底是:或者可以吧。你获得的功效是:只要你引用了这个头文件N次,那么就会获得N+1次编译器告诫,选择你这个变量反复界说,在你引用这个变量的单位中,确实可以利用这个变量,可是在一个单位中对它赋值,在另一个单位中确得不么,也就是说,它基础就不是全局的,编译器的处理惩罚要领是,在每个单位中从头以这个名称声明白一个变量罢了。
(2).假如我在工程文件.cpp中声明一个变量,在其它单位中可以直接利用它吗?如下:
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
//---------------------------------------------------------------------------
USEFORM("TMainForm.cpp", MainForm);
//---------------------------------------------------------------------------
AnsiString UserName;
//---------------------------------------------------------------------------
WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
try
{
Application->Initialize();
Application->CreateForm(__classid(TMainForm), &MainForm);
Application->Run();
}
catch ... //这里省略了一部门
return 0;
}
//---------------------------------------------------------------------------
谜底是:不行以。可是这确实是界说全局变量的正确要领之一。在工程文件.cpp中声明白变量,假如想在其它单位中利用它,必需利用extern要害字,来声明这个变量是外部的,所以,在需要利用这个全局变量的单位中,利用extern AnsiString FileName就可以引用一例中的全局变量了。
#p#副标题#e#
(3).在VCL架构的措施中,我们常常用到一些全局变量,你有没有意识到呢?Application、Screen、IsConsole、IsLibray…等都是应用措施级的全局变量,假如想相识更多,请参照VCL手册的application-level information有关的章节。那么,这些全局变量是如何界说的呢?
我们揭开VCL的迷雾,直接去查察VCL的代码(C++Builder中无法直接看到.pas的源代码,可是编译器为每个.pas文件生成了一个.hpp的头文件引用,看看个中的变量和函数声明即可):在措施空缺处输入Application,按住Ctrl键,再点击它,我们就找到了Application变量的原始界说,如下:
//-- var, const, procedure ---------------------------------------------------
extern PACKAGE TApplication* Application; //请看这里
extern PACKAGE TScreen* Screen;
extern PACKAGE void *Ctl3DBtnWndProc;
本来VCL扩展了extern要害字,在.h或.hpp头文件用extern PACKAGE来输出原来在.cpp和.pas单位中界说的变量,使之成为全局变量,因此,我们获得了第三种声明全局变量的要领:利用extern PACKAGE要害字,如下,输出一个全局变量:
//-----------------------------Globals.cpp-----------------------------------
#pragma hdrstop
#include "Globals.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
//---------------------------------------------------------------------------
AnsiString UserName = "YinJiajun";
//---------------------------------------------------------------------------
//-----------------------------Globals.h-------------------------------------
#ifndef GlobalsH
#define GlobalsH
//---------------------------------------------------------------------------
#include <Classes.hpp>
//---------------------------------------------------------------------------
extern PACKAGE AnsiString UserName;
//---------------------------------------------------------------------------
#endif
#p#分页标题#e#
跋文:大虾们都汇报我们,不要利用太多的全局变量,不要利用goto……于是,当你写措施时,老是有这样的声明在我们脑中反响:“不要利用太多的全局变量,不要利用goto……”。为什么不要利用这些对象?因为难以驾御。假如你已剑气合一,是否尚有这样的记挂?
刀可以用来切菜,也可以用来杀人,不能因为刀能杀人而克制用刀。
假如利用全局变量能让你的措施简捷明白、可读性好,为什么不消?
为什么这些现代措施设计语言仍然要支持goto和全局变量?