如何定义C++builder的全局变量

mxp 2000-06-23 10:30:00
不要告诉我在.h的Public中定义!!!
我要的是不打开任何.h就能使用的真正全局变量,属于工程,不属于类,请详细说一下有几种可定义的位置!
...全文
550 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
april_d 2001-10-18
  • 打赏
  • 举报
回复
gz
mxp 2000-06-23
  • 打赏
  • 举报
回复
不是我要用,而是我经常看见一些网友说全局变量不安全,又什么占用内存等等,又是工程加载就使用啦,等等,所以要用类的共享变量,我怎么从没在任何资料上看见有属于工程不用打开头文件的变量?!!因此我想知道所说的不安全的全局变量是什么?
duhorse 2000-06-23
  • 打赏
  • 举报
回复
可以试试在project->view source中加入,行吗?
halfdream 2000-06-23
  • 打赏
  • 举报
回复
在一个工程中专门用一个UNIT存放全局变量吧。
呵呵,这样还是要INCLUDE 头文件的。
变量定义在其中的CPP文件中。再在头文件中声明一下。
如:
//----------------CPP file------------
int a;
float b;
AnsiString c; //这几个是定义
//----------------------------------------
//----------------H file------------------
extern int a;
extern float b;
extern AnsiString c; //这几个是对应的声明, 要分清。
//---------------------------------

另外在头文件有个地方稍稍注意一下:
#ifndef Unit2H
#define Unit2H
//(在这个地方放你的声明代码, 这样可以避免因多重#include 造成的重复声明)

#endif

radish 2000-06-23
  • 打赏
  • 举报
回复
你为什么要用全局变量?
halfdream 2000-06-23
  • 打赏
  • 举报
回复
你说‘如果是指针分配内存后,没有释放,也不随着应用程序的关闭而自动释放’
我差不多也是这样认为。不过我还是有些怀疑:
WINDOWS 为每个进程一个进程堆,即所谓的全局堆, 用new 这样动态分配的内存都
是从这个全局堆中分配, 在进程结束的时候, 这个进程堆应该是完全释放吧,这样就
算里面的指针没有完全释放内存,好象也没有关系吧?
另外, VCL 对象有一个要求,是必须都用new动态分配,
这一点极象JAVA的思想。JAVA 可以不用手工释放动态分配的内存。
我想VCL 也提供了一种机制自动释放分配的内存。
halfdream 2000-06-23
  • 打赏
  • 举报
回复
在同一个文件中定义的全局变量可以直接用。
在另一个文件中定义的,必须先声明再用。如:extern int a; a=8;
这是因为编译器是将各文件先独立编译成OBJ文件后再链接的。如果不声明,
编译器是绝不知道有这个变量定义在其它文件。
mxp 2000-06-23
  • 打赏
  • 举报
回复
另外,我想所说的占内存可能是不随着任何窗体的释放而消失,如果是指针分配内存后,没有释放,也不随着应用程序的关闭而自动释放。
mxp 2000-06-23
  • 打赏
  • 举报
回复
对,我就是想知道在任何窗体中不需要声明就可以使用的变量,在工程(不知道何处)中定义,各个窗体用不着对它作处理,拿来就用,比如在 有个全局变量 a,在窗体Form1中a=8;(就是直接写a=8;别的什么都不用做,包括include),只要不改变a在窗体 Form2中 a还是等于 8 。有没有?

halfdream 2000-06-23
  • 打赏
  • 举报
回复
需要的时候还是用一下吧。 变量不占内存占什么? :)
所谓的不安全,全局变量主要问题就是因为在哪个函数中都可以访问它。
不小心会造成一些问题。
所谓#include 其实就是相当于把声明的那段代码,粘贴过来。同手工声明一点区别都没有。
呵呵。什么叫属于工程的变量?
是说的放在工程的主cpp文件中的变量吗?
其实,很多只是常识就可以推断,别想复杂了。
你可以写程序试试, 定义各种变量, 包括用NEW 来分配空间。
然后显示它们的地址值,看看内存分配的问题,让事实来说话。
mxp 2000-06-23
  • 打赏
  • 举报
回复
>可以试试在project->view source中加入,行吗?
早就试过了,不好用!
文件: ActnList CreateAction 函数 创建一个指定类型的Action,显示在action list editor中。 EnumRegisteredAction 过程 枚举已经注册的Action RegisterAction 过程 注册Action UnRegisterAction 过程 反注册Action 文件: Classes Bounds 函数 输入上下高宽返回一个矩形结构。 CollectionsEqual 函数 比较两个TCollection是不是相等。 CurrentGroup 变量 FindClass 函数 从输入字符串中返回一个从TPersistent继承的类 FindGlobalComponent 变量 返回一个最高阶的容器类。 GetClass 函数 返回一个已经注册了的从TPersistent继承的类 LineStart 函数 返回下一行的开始字符位置 ObjectBinaryToText 过程 转换对象的二进制流形式到文件。 ObjectResourceToText 过程 转换对象的二进制资源到文件。 ObjectTextToBinary 过程 转换保存对象的文件形式到二进制流。 ObjectTextToResource 过程 转换保存对象的文件形式到资源。 Point 函数 输入X,y坐标返回一个点结构。 ReadComponentRes 函数 从窗口资源中读出一个控件和她的属性。 ReadComponentResEx 函数 同上 ReadComponentResFile 函数 从窗口资源文件中读出一个控件和她的属性。 Rect 函数 输入上下左右返回一个矩形结构 RegisterClass 过程 注册一个从TPersistent继承的类,使她的类的类型能够被识别。 RegisterClassAlias 过程 注册一个和另一个除了名字外都相同的类。 RegisterClasses 过程 注册一组类 RegisterComponents 过程 注册一组控件 RegisterIntegerConsts 过程 RegisterNoIcon 过程 注册一组没有图标的控件 RegisterNonActiveX 过程 防止一组控件被ActiveX wizard识别。 UnregisterClass 过程 反注册一个类 UnregisterClasses 过程 反注册一组类 UnregisterModuleClasses 过程 反注册定义在模块中的所有的类 WriteComponentResFile 过程 写控件和她的属性到文件。 文件: Clipbrd Clipboard 函数 返回一个TClipboard对象 SetClipboard 函数 用一个新TClipboard替换全局TClipboard。
1 单元 每个单元只包含一个类的声明。类中不永许写类的实现,类成员函数不超过20个,需要被外界调用的成员函数放在Public外,其余的全部放在Proteced,明确的不想让继承者修改的话放在Private中。 包含的头文件 也就是#include 在头文件应该包含该类所需要的类型的。如果cpp也包含了,那么头文件就不要在包含,使用Class vcl; 告诉头文件有些需要的已经在CPP文件中包含啦!另外对不再使用的包含文件要及时的清除出去,否则可能碰到连接出错的问题,bcb的连接提示少的可怜啊!就有苦头吃拉!还有要记得给自己加进的包含写注解啊!! 2 实现文件中 千万不要定义全局变量和全局函数,至于会发什么问题啦,只有碰到了几十万的代码,五六个项目集合,一两百个单元所可能发生的问题。 那该怎么办了? 简单把它归到所在单元的类声明中去。函数的实现代码行不要超过200行 包括之间的空格.因为人的暂时记忆能力不强啊! 为什么文章要分段落啊! 就是人暂存上下文的关联的内存是有限的呀 3 组件的属性设置和数据库的字段表名: 一般下都会在对象检查器中的设置。当调试过不去而你又忘记了设置的属性时的哭相,是多么地可气啊!而且BCB没有组件之间的比较,否则的话可以拖个同样的新组件来比一比到底哪里设置的不同! 所以没有办法只好麻烦些直接在代码中设置吧! 虽然很麻烦 却可以节省比较可观的时间呀! 要不就像 kateboy (老公)由于设置了ADOConnection 的Attrib里中的自动事务处理。每当退出程序时就报错!从早上跑到各大BCB的QQ群中求人帮助,只到最后吃晚饭才惊奇发现了毛病所在! 还有一次不知那各BCB老大自报家丑 说自己吸了5包烟抓改BUG直到凌晨时分,方发现了它,原来是书写错误。
1. 创建一个基于对话框的应用程序。并增加如图所示控件;分别为3个进度条控件关联三个进度条类型的变量;并在对话框的初始化函数中,设定进度条的范围;为编辑框关联一个整型的变量;为12个按钮添加消息处理函数; 2. 定义结构体:用做线程函数的参数传递 typedef struct Threadinfo{ CProgressCtrl *progress;//进度条对象 int speed; //进度条速度 int pos; //进度条位置 } thread,*lpthread; 3. 为对话框增加三个句柄,用于标识各个线程; HANDLE hThread1; //线程1线程句柄 HANDLE hThread2; //线程2线程句柄 HANDLE hThread3; //线程3线程句柄 在增加三个结构体类型的变量,用做线程函数的参数传递; HANDLE hThread1; //线程1线程句柄 HANDLE hThread2; //线程2线程句柄 HANDLE hThread3; //线程3线程句柄 4. 新增一个静态的全局变量,用于记录所有线程的状态:static int GlobalVar=10000; 5. 声明并编写线程函数,注意只能有一个参数,且函数的返回值类型也是固定的;函数名可以自定义; DWORD WINAPI ThreadFun(LPVOID pthread);//线程入口函数 6. 在启动按钮的消息处理函数中编写如下代码: thread1.progress=&m_progress1;//进度条对象 thread1.speed=100;//速度 thread1.pos=0;//初始位置 hThread1=CreateThread(NULL,0,ThreadFun,&thread1;,0,0);//创建并开始线程 if (!hThread1) { MessageBox("创建线程失败"); } 7. 编写线程函数(一般是一个死循环,或者需要花费时间很长的算法!否者就失去了多线程的意义) DWORD WINAPI ThreadFun(LPVOID pthread) //线程入口函数 { lpthread temp=(lpthread)pthread;//参数强制转换为结构体类型 temp->progress->SetPos(temp->pos); //设置被传递过来的进度条的位置 while(temp->posspeed); /设置速度 temp->pos++; //增加进度 temp->progress->SetPos(temp->pos); //设置进度条的新位置 GlobalVar--; if(temp->pos==20) { temp->pos=0; //进度条满则归0 } } return true; } 8. 在挂起按钮函数中,编写如下代码: if(SuspendThread(hThread1)==0xFFFFFFFF) { MessageBox("挂起失败!进程可能已经死亡或未创建!"); return; } 9. 在执行按钮函数中,编写如下代码: if(ResumeThread(hThread1)==0xFFFFFFFF) { MessageBox("执行失败!进程可能已经死亡或未创建!"); return; } 10. 在停止按钮函数中,编写如下代码: if(TerminateThread(hThread1,0))//前些终止线程 { CloseHandle(hThread1);//销毁线程句柄 } else { MessageBox("终止进程失败!"); } 11. 为应用程序添加WM_TIMER消息,实时更新全局变量的值到编辑框;

13,825

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧