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

2016-02-19 17:00 0 1 收藏

下面请跟着图老师小编一起来了解下如何在C++Builder中使用全局变量,精心挑选的内容希望大家喜欢,不要忘记点个赞哦!

【 tulaoshi.com - 编程语言 】

  本文详细解释了如何在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中声明一个变量,在其它单元中可以直接使用它吗?如下:

(本文来源于图老师网站,更多请访问https://www.tulaoshi.com/bianchengyuyan/)

  

  //---------------------------------------------------------------------------
  #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单元中定义的变量,使之成为全局变量,因此,我们得到了第三种声明全局变量的方法:使用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和全局变量?

(本文来源于图老师网站,更多请访问https://www.tulaoshi.com/bianchengyuyan/)

来源:https://www.tulaoshi.com/n/20160219/1613859.html

延伸阅读
最近经常看到有人询问如何在C++ Builer中使用XML,开始作者也认为莫名其妙,首先XML技术似乎经常与网络联系起来,或者SOAP/WEB Service,其次C++ Builer提供了TXMLDocument组件,应该会很轻易使用。这几天作者在研究TOMCAT,发现它的配置文件是用XML文件编写的,似乎这代表了软件的先进型:),于是我也决定用C++ Builer来操作XML文件来增加自己...
在信息爆炸式增长的今天,每天都有大量新的网站诞生,每时每刻网上都传递着难以计数的信息。建立网站来进行自我宣传和信息交流已成为一种新潮的媒体宣传方式,多姿多彩的网页也成为Internet中最为绚丽的部分。您也许已经注意到,在网络速度不断提高的今天,网站的站主们为了留住访问者的视线,开始越来越多地在网页中使用精美的动画、交互...
姑且不谈论OpenGL的名贵背景和光明前途,单凭其实用性和有效性就足以使其成为我们图形输出编程的首选。但是在实际工程应用中程序员没必要仔细地深究OpenGL的运作机制,也往往不需要掌握各种高级的效果制作,真正需要的是最简捷地利用这个得力的工具实现输出数据的可视化,如波形、谱图、立体统计图表等的显示。有鉴于此,本文总结出了在C++...
在C++Builder中利用TImage控件可以轻松地读入并显示图象,但TImage 控件本身不可以接收输入焦点,也没带有滚动条,在显示超出显示区域范围的大图象时,需要对TImage控件进行加强。本文提出两种最容易实现且有效的方法,满足不同应用的需求。 方法一:增加滚动条。 增加滚动条可以通过将TImage放在TScrollBox控件中来实现。步骤如...
Borland C++ Builder是基于C++语言的可视化编程环境,它提供了可重用组件库和一系列RAD设计工具,使得编程者只需用少量的手工代码就可以创建出高效的Windows应用程序,尤其是复杂的数据库访问应用程序,因此深受软件开发人员的喜爱。 在开发数据库访问应用程序时,会经常涉及到报表的打印问题。C++ Builder中提供了Quick Report...

经验教程

987

收藏

50
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部