如安在C++Builder中利用全局变量
当前位置:以往代写 > C/C++ 教程 >如安在C++Builder中利用全局变量
2019-06-13

如安在C++Builder中利用全局变量

如安在C++Builder中利用全局变量

副标题#e#

本文具体表明白如安在C++Builder中利用全局变量。

作者:yifei(尹加俊)

信箱:[email protected]

如安在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和全局变量?

    关键字:

在线提交作业