如何在C++Builder中使用全局变量
如何在C++Builder中使用全局变量
关键字:C++Builder,全局变量
作者:yifei(逸飞) 更新:2005-09-14 浏览:13665
作者: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中使用全局变量相关推荐
- 如何在Django模板中注入全局变量
我们在做一些网站项目的时候,可能会遇到需要把某个全局变量注入到所有页面的情况,比如我们做一个在线商城,那么可能需要将用户的资料:比如用户的账号.用户的姓名等注入到每个页面里面. 但是如果用常规的方法, ...
- 3dmax如何拆分模型_如何在3D Builder中拆分3D模型。 Windows解决方案
如何安全找回丢失数据的方法 1. 下载并安装B计划数据恢复软件. 2. 运行恢复软件,点击"深度扫描". 深度扫描是绕过文件系统直接从硬盘.U盘.SD卡等设备底层恢复数据,因此使用 ...
- C++builder中输出hello
下面简单介绍一下如何在C++builder中实现hello world以及汉字版世界你好的方法: 1.首先打开C++builder软件,在其主界面的Form1窗体中加入一个label1和一个butto ...
- c语言 引用定义变量,如何在c语言中定义及引用全局变量?
如何在c语言中定义及引用全局变量? 答案:5 信息版本:手机版 解决时间 2019-10-03 10:30 已解决 2019-10-02 15:19 如何在c语言中定义及引用全局变量? 最佳答案 2 ...
- angular中如何定义全局变量_如何在Angular 2 / Typescript中声明全局变量?
这是最简单的解决方案,Service没有/ 也没有Observer: 将全局变量放在文件中,然后导出它们. // // ===== File globals.ts // 'use strict'; e ...
- 如何在React Native中写一个自定义模块
前言 在 React Native 项目中可以看到 node_modules 文件夹,这是存放 node 模块的地方,Node.js 的包管理器 npm 是全球最大的开源库生态系统.提到npm,一般指 ...
- 在JavaScript函数中定义全局变量
是否可以在JavaScript函数中定义全局变量? 我想在其他函数中使用trailimage变量(在makeObj函数中声明). <html xmlns="http://www.w3. ...
- 如何在Java 8中使用LocalDateTime格式化/解析日期-示例教程
Java项目中的常见任务之一是将日期格式化或解析为String,反之亦然. 解析日期表示您有一个表示日期的字符串,例如" 2017-08-3",并且要将其转换为表示Java中日期的 ...
- 如何在 React Native 中写一个自定义模块
前言 在 React Native 项目中可以看到 node_modules 文件夹,这是存放 node 模块的地方,Node.js 的包管理器 npm 是全球最大的开源库生态系统.提到npm,一般指 ...
最新文章
- linux shell 从变量中按指定字符切割字符串
- rog live service是什么_王者荣耀五周年好礼送不停,玩游戏还能白嫖ROG游戏手机3?...
- kido机器人用流量吗_国脉电信200元天网卡,交1700流量无线用,拉人加入还会有不错的收益,你信吗?反正我是不信!...
- python中shift函数rolling_【邢不行|量化小讲堂系列18-Python量化入门】简易波动指标(EMV)策略实证...
- 不错的向上滚动广告代码
- java集合,Collection,list,set,map汇总
- c#类中字段和方法中变量的声明问题
- 金阳光测试算法专题——精选小算法汇总
- macbook用户注意了,这个行为可能导致显示屏损坏
- 考研英语近义词与反义词·十三
- NLP︱中文分词技术小结、几大分词引擎的介绍与比较
- 召回和粗排负样本构造问题
- vpa函数python_python 调用百度接口 做人脸识别
- ganglia监控hadoop集群配置
- 熟知ghost参数 恢复系统没烦恼【xpghost】
- 【Android】实战图像识别:Compose + MLKit + CameraX
- 艺赛旗(RPA)获取 T-n 工作日 日期解决方案
- php 读取xls乱码,file_get_contents读取xls一片乱码?
- 万国数据登陆纳斯达克 宣布首次公开发行股票定价
- sql 查询排名 排名可并列