您的位置:首页 > 产品设计 > UI/UE

如何在C Builder中使用全局变量

2009-03-12 16:08 204 查看
本文详细解释了如何在C Builder中使用全局变量。

作者:yifei(尹加俊)

信箱:yifei1900@163.com

  如何在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就可以引用一例中的全局变量了。

// 本文转自 C Builder研究 - http://www.ccrun.com/article.asp?i=626&d=wph422
  (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

  后记:大虾们都告诉我们,不要使用太多的全局变量,不要使用goto......于是,当你写程序时,总是有这样的声明在我们脑中回响:“不要使用太
多的全局变量,不要使用goto......”。为什么不要使用这些东西?因为难以驾驭。如果你已剑气合一,是否还有这样的顾虑?

  刀可以用来切菜,也可以用来杀人,不能因为刀能杀人而禁止用刀。

  如果使用全局变量能让你的程序简洁明了、可读性好,为什么不用?

  为什么这些现代程序设计语言仍然要支持goto和全局变量?
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: