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

关键字:C++Builder,全局变量

作者:yifei(逸飞)    更新:2005-09-14    浏览:13665

本文详细解释了如何在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和全局变量?

如何在C++Builder中使用全局变量相关推荐

  1. 如何在Django模板中注入全局变量

    我们在做一些网站项目的时候,可能会遇到需要把某个全局变量注入到所有页面的情况,比如我们做一个在线商城,那么可能需要将用户的资料:比如用户的账号.用户的姓名等注入到每个页面里面. 但是如果用常规的方法, ...

  2. 3dmax如何拆分模型_如何在3D Builder中拆分3D模型。 Windows解决方案

    如何安全找回丢失数据的方法 1. 下载并安装B计划数据恢复软件. 2. 运行恢复软件,点击"深度扫描". 深度扫描是绕过文件系统直接从硬盘.U盘.SD卡等设备底层恢复数据,因此使用 ...

  3. C++builder中输出hello

    下面简单介绍一下如何在C++builder中实现hello world以及汉字版世界你好的方法: 1.首先打开C++builder软件,在其主界面的Form1窗体中加入一个label1和一个butto ...

  4. c语言 引用定义变量,如何在c语言中定义及引用全局变量?

    如何在c语言中定义及引用全局变量? 答案:5  信息版本:手机版 解决时间 2019-10-03 10:30 已解决 2019-10-02 15:19 如何在c语言中定义及引用全局变量? 最佳答案 2 ...

  5. angular中如何定义全局变量_如何在Angular 2 / Typescript中声明全局变量?

    这是最简单的解决方案,Service没有/ 也没有Observer: 将全局变量放在文件中,然后导出它们. // // ===== File globals.ts // 'use strict'; e ...

  6. 如何在React Native中写一个自定义模块

    前言 在 React Native 项目中可以看到 node_modules 文件夹,这是存放 node 模块的地方,Node.js 的包管理器 npm 是全球最大的开源库生态系统.提到npm,一般指 ...

  7. 在JavaScript函数中定义全局变量

    是否可以在JavaScript函数中定义全局变量? 我想在其他函数中使用trailimage变量(在makeObj函数中声明). <html xmlns="http://www.w3. ...

  8. 如何在Java 8中使用LocalDateTime格式化/解析日期-示例教程

    Java项目中的常见任务之一是将日期格式化或解析为String,反之亦然. 解析日期表示您有一个表示日期的字符串,例如" 2017-08-3",并且要将其转换为表示Java中日期的 ...

  9. 如何在 React Native 中写一个自定义模块

    前言 在 React Native 项目中可以看到 node_modules 文件夹,这是存放 node 模块的地方,Node.js 的包管理器 npm 是全球最大的开源库生态系统.提到npm,一般指 ...

最新文章

  1. linux shell 从变量中按指定字符切割字符串
  2. rog live service是什么_王者荣耀五周年好礼送不停,玩游戏还能白嫖ROG游戏手机3?...
  3. kido机器人用流量吗_国脉电信200元天网卡,交1700流量无线用,拉人加入还会有不错的收益,你信吗?反正我是不信!...
  4. python中shift函数rolling_【邢不行|量化小讲堂系列18-Python量化入门】简易波动指标(EMV)策略实证...
  5. 不错的向上滚动广告代码
  6. java集合,Collection,list,set,map汇总
  7. c#类中字段和方法中变量的声明问题
  8. 金阳光测试算法专题——精选小算法汇总
  9. macbook用户注意了,这个行为可能导致显示屏损坏
  10. 考研英语近义词与反义词·十三
  11. NLP︱中文分词技术小结、几大分词引擎的介绍与比较
  12. 召回和粗排负样本构造问题
  13. vpa函数python_python 调用百度接口 做人脸识别
  14. ganglia监控hadoop集群配置
  15. 熟知ghost参数 恢复系统没烦恼【xpghost】
  16. 【Android】实战图像识别:Compose + MLKit + CameraX
  17. 艺赛旗(RPA)获取 T-n 工作日 日期解决方案
  18. php 读取xls乱码,file_get_contents读取xls一片乱码?
  19. 万国数据登陆纳斯达克 宣布首次公开发行股票定价
  20. sql 查询排名 排名可并列

热门文章

  1. 正则表达式入门教程-连载(4)-点符号(.)
  2. 组件开发之ASP.NET中集成资源文件的服务器端控件开发
  3. 基于.Net Remoting的项目总结报告
  4. 杭电find the night
  5. hdu 1228-A+B
  6. 【洛谷 3372】线段树 1
  7. SpringMVC+ZTree实现树形菜单权限配置
  8. 博弈论(Game Theory) - 04 - 纳什均衡
  9. 配置JDK时环境变量path和JAVA_HOME的作用
  10. HDU 1054 Strategic Game 最小点覆盖