2010年9月2日星期四

VC中怎么使用全局变量

全局变量一般这样定义:
1。在一类的.cpp中定义 int myInt;
然后再在要用到的地方的.cpp里extern int myInt;这样就可以用了。2。在stdafx.cpp中加入:
int myInt;
然后在stdafx.h中加入:
extern int myInt
这样定义以后无论在什么文件中都是可见的.3。比较规范的是,先定义一个Glbs.h,把所有的全局变量原始定义放进去。然后定义一个 Externs.h,把你先前定义在Glbs.h中的变量都加上extern。注意:如果你在Glbs.h中设置了初值,那么在Externs.h中就不 要加值了。然后调用时,第一次调用的#i nclude ,以后调用的#i nclude另:问:如何在VC++中使用全局变量,以使文档中的所有类都能访问。
答:把该变量放到该应用程序类的头文件中的attribute处。然后,在程序的任何地方,你都可以用下面的方法来访问该变量:
CMyApp *app=(CMyApp*)AfxGet-App();
app->MyGlobalVariable=…
用这个方法,不但可以定义全局变量,也可以定义全局对象。
例如:
MyClass MyObject;
CMyApp*app=(CMyApp*)AfxGet-App();
app->MyObject.MyFunction();VC中使用全局变量的2种办法及防错措施[ 2005-8-17 13:16:00 | By: freeion ]

1. 对于全局变量存在和函数一样的问题,为了在其他CPP文件中能够访问这些变量,必须在主文件的H文件中加上extern声明,格式如下:
externvaribletypevar; (声明)
在主文件的CPP文件中定义
varibletypevar; (定义)
例子:
AppWizard建立一个Test工程
那么在Test.h中声明externCStringcs;
在Test.app定义CStringcs;如果要定义整个工程的全局变量,在任何一个CPP文件中进行定义,然后在需要引用这个变量的文件中进行声明。如全局变量很多可以选择使用定义全局变量的。h文件,在需要的地方直接include头文件即可,不需要写那么多extern了。
2.应用程序类的主头文件处定义变量varibletypevar,然后,在程序的任何地方,都可以用下面的方法来访问该变量:
CClassApp*app=(CClassApp*)AfxGetApp();
app->var=
类似的,以上方法也可以定义全局对象
例子:
AppWizard建立一个Test工程
那么在Test.h中声明CStringcs;
使用的时候CTestApp*app=(CTestApp*)AfxGetApp();
app->cs="Global"

防错措施:
若定义的函数和全局变量在多个文件包含且造成嵌套或多次调用的话,这样将导致这个头文件每被包含依次,函数或变量就被重新定义一次,在链接编译时会导致重定义错误。为此需要使用一种被称为Guardmacro的技术来保证不出错。在一个头文件开头加上
#ifndef_MACRO_1_
#define_MACRO_1_
在文件末尾增加
#endif
another :?做两个头文件:global.h, globalExt.h
在global.h中:
#ifndef _GLOBAL_H_
#define _GLOBAL_H_
//变量定义
int nTest;
float fTest;
#endif

在globalExt.h中:
#ifndef _GLOBALEXT_H_
#define _GLOBALEXT_H_
//变量定义
extern int nTest;
extern float fTest;
#endif

在任意一个文件中包含:global.h(只有一个文件)
在其他的文件中包含:globalExt.h
more:二、用静态变量和静态函数实现  很喜欢API函数的那种调用方法,不论在哪个类中只要用“::API函数”就可以调用了。合理利用静态类型(static)可以实现与此相似的全局变量和全局函数。  静态变量和静态函数有如下性质:  若在一个类中用关键字static声明数据成员,则这个数据成员就只存在一个拷贝,无论该类创建了多少个实例,它始终只存在一个,即使该类的实例一个也没创建,它也存在。  若在一个类中用关键字static声明函数,该函数可以用“类名::函数名”方式访问,无需引用该类的实例,甚至这个类的实例可以不存在。  利用这个性质实现的全局变量和函数使用起来很方便。  值得注意的是,全局变量和全局函数最好集中封装,不要在文档、视图等类内部定义,这样用起来才有全局的感觉。  例:  1、添加一个没有基类的新类,设类名起为CPublic,姑且称之为公用类  单击“Insert”菜单下的“New Class”命令,选择“Class type”为“Generic Class”,在“Name”栏中填入类名“CPublic”,单击“OK”,则新类建立完毕。  2、包含公用类的头文件,使各个类都能访问它  CPublic的头文件应包含在应用程序类的头文件中,这样在其它类中引用CPublic类时就不需要再包含了。  Test.h:(应用程序类头文件)#include "Public.h" //包含公用类头文件class CTestApp : public CWinApp
{
…………
};  3、在公用类中定义全局变量和全局函数,均使用static修饰,静态变量还必须在类外定义和初始化  Public.h:(公用类头文件)class CPublic
{
public:
CPublic();
virtual ~CPublic();public:
static int x; //全局变量
static int time; //全局变量
static int f(int y); //全局函数
…………
}  在公用类中对静态变量进行初始化和定义函数体:  Public.cpp:(公用类程序文件)int CPublic::x = 0; //初始化全局变量
int CPublic::time; //定义全局变量CPublic::CPublic()
{}CPublic::~CPublic()
{}int CPublic::f(int y) //全局函数,这里不要再加static
{
y++;
return y;
}  4、全局量的使用  使用变量:CPublic::变量名  使用函数:CPublic::函数()  如在视图的某函数中访问变量x和函数f():void CTestView::xyz()
{
CPublic::x = 0; //访问变量x
CPublic::time = CPublic::f(1); //访问函数f()
…………
}  在其它类中访问x、time和f()的方法与此相同。  5、几点注意:  ① 由于静态量可独立于类存在,不需要生成CPublic类的实例。  ② 静态数据成员的定义和初始化必须在类外进行,如例中x的初始化;变量time虽然没有初始化,但也必须在类外进行定义。由于没有生成CPublic类的实例,所以它的构造函数和析构函数都不会被执行,在里面做什么工作都没有什么意义。  ③ 如果静态函数需要访问CPublic类内的变量,这些变量也必须为静态的。因为非静态量在不生成实例时都不会存在。如:class CPublic
{
public:
int x; //内部变量
static int f(int y) //全局函数
{
x++;
return x;
};
…………
};  这里x虽为类内成员,但如果不生成CPublic类的实例,就会出现函数f()存在,而变量x不存在的问题。

没有评论: