快速业务通道

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

作者 佚名技术 来源 程序设计 浏览 发布时间 2012-06-30

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

(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单元中定义的变量,使之成为全局变量,因此,我们

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号