`
java-mans
  • 浏览: 11451089 次
文章分类
社区版块
存档分类
最新评论

VC中定义全局变量

 
阅读更多
1 VC中如何定义全局变量

答:
放在任意文件里
在其他文件里用extern声明
或者在App类中声明一个公有成员
在程序其它类中可以用
AfxGetApp()得到一个App对象指针,将它转化成你的App类指针
然后就可以通过指针->变量使用了
还有就是在
MFC中定义只有静态成员的类到时候直接应用就可以了,还不
破坏结构

答:也可以新建一个.h的头文件,专门用来放全局变量。哪里要用到它,就Include一下

二、全局变量一般这样定义:
1。在一类的.cpp中定义intmyInt;
然后再在要用到的地方的.cpp里externintmyInt;这样就可以用了。

2。在stdafx.cpp中加入:
intmyInt;
然后在stdafx.h中加入:
externintmyInt
这样定义以后无论在什么文件中都是可见的.

3。比较规范的是,先定义一个Glbs.h,把所有的全局变量原始定义放进去。然后定义一个Externs.h,把你先前定义在Glbs.h中的变量都加上extern。注意:如果你在Glbs.h中设置了初值,那么在Externs.h中就不要加值了。然后调用时,第一次调用的#include<Glbs.h>,以后调用的#include<Externs.h>

另:

问:如何在VC++中使用全局变量,以使文档中的所有类都能访问。
  答:把该变量放到该应用程序类的头文件中的attribute处。然后,在程序的任何地方,你都可以用下面的方法来访问该变量:
  CMyApp*app=(CMyApp*)AfxGet-App();
  app->MyGlobalVariable=…
  用这个方法,不但可以定义全局变量,也可以定义全局对象。
  例如:
  MyClassMyObject;
  CMyApp*app=(CMyApp*)AfxGet-App();
  app->MyObject.MyFunction();

VC中使用全局变量的2种办法及防错措施

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

另外转一下一位朋友写的在MFC中定义全局变量

在MFC下如何定义全局变量和全局函数VC++

用MFC制作的工程由很多文件构成,它不能象一般C++程序那样随意在类外定义全局变量,在这里要想定义能被工程内多个文件共享的全局变量和函数必须用一些特殊方法才行。实际上有多种方法可以实现,这里只介绍两种方法。

一、在应用程序类中定义

用MFC生成的工程中都有一个名为CxxxApp的类,它派生于CWinApp类。这个类主要进行程序的初始化,生成文档、视图对象等工作。我们可以把需要全局访问的变量和函数定义为这个类的成员变量和成员函数,就可以实现全局访问了。

从严格意义上讲,这种变量和函数并不是全局的,因为它仍然只是类中的成员,只是由于我们很容易获得CxxxApp类的指针,所以我们可以在文档、视图、对话框以及各种自定义类中访问到它们,达到与全局变量类似的效果。访问时用函数“AfxGetApp()”获得CxxxApp类的指针,用“AfxGetApp()->成员”访问变量或函数。
例:

Test.h:(应用程序类头文件)

classCTestApp:publicCWinApp
{
public:
intx;//全局变量
intf(inty);//全局函数
…………
};
Test.cpp:(应用程序类程序文件)

intCTestApp::f(inty)//全局函数定义
{
y++;
returny;
}
定义在CTestApp类中的变量和函数可以在其它类中被访问。比如在视图的某函数中要访问变量x和函数f():

voidCTestView::xyz()
{
CTestApp*app=(CTestApp*)AfxGetApp();//生成指向应用程序类的指针
app->x=0;//访问变量x
intz=app->f(1);//访问函数f()
…………
}
这样,变量x和函数f()可以视作为全局的。

用这种方法实现的全局变量和全局函数虽比较简单,但也有缺点,一是访问不太方便,每次都需要获取应用程序类的指针;再就是把一些与应用程序类本身无关的变量和函数放在里面,使这个类看上去怪怪的,破坏了类的封装。

二、用静态变量和静态函数实现

很喜欢API函数的那种调用方法,不论在哪个类中只要用“::API函数”就可以调用了。合理利用静态类型(static)可以实现与此相似的全局变量和全局函数。

静态变量和静态函数有如下性质:

若在一个类中用关键字static声明数据成员,则这个数据成员就只存在一个拷贝,无论该类创建了多少个实例,它始终只存在一个,即使该类的实例一个也没创建,它也存在。

若在一个类中用关键字static声明函数,该函数可以用“类名::函数名”方式访问,无需引用该类的实例,甚至这个类的实例可以不存在。

利用这个性质实现的全局变量和函数使用起来很方便。

值得注意的是,全局变量和全局函数最好集中封装,不要在文档、视图等类内部定义,这样用起来才有全局的感觉。

例:

1、添加一个没有基类的新类,设类名起为CPublic,姑且称之为公用类

单击“Insert”菜单下的“NewClass”命令,选择“Classtype”为“GenericClass”,在“Name”栏中填入类名“CPublic”,单击“OK”,则新类建立完毕。

2、包含公用类的头文件,使各个类都能访问它

CPublic的头文件应包含在应用程序类的头文件中,这样在其它类中引用CPublic类时就不需要再包含了。

Test.h:(应用程序类头文件)

#include"Public.h"//包含公用类头文件

classCTestApp:publicCWinApp
{
…………
};
3、在公用类中定义全局变量和全局函数,均使用static修饰,静态变量还必须在类外定义和初始化

Public.h:(公用类头文件)

classCPublic
{
public:
CPublic();
virtual~CPublic();

public:
staticintx;//全局变量
staticinttime;//全局变量
staticintf(inty);//全局函数
…………
}
在公用类中对静态变量进行初始化和定义函数体:

Public.cpp:(公用类程序文件)

intCPublic::x=0;//初始化全局变量
intCPublic::time;//定义全局变量

CPublic::CPublic()
{

}

CPublic::~CPublic()
{

}

intCPublic::f(inty)//全局函数,这里不要再加static
{
y++;
returny;
}
4、全局量的使用

使用变量:CPublic::变量名

使用函数:CPublic::函数()

如在视图的某函数中访问变量x和函数f():

voidCTestView::xyz()
{
CPublic::x=0;//访问变量x
CPublic::time=CPublic::f(1);//访问函数f()
…………
}
在其它类中访问x、time和f()的方法与此相同。

5、几点注意:

①由于静态量可独立于类存在,不需要生成CPublic类的实例。

②静态数据成员的定义和初始化必须在类外进行,如例中x的初始化;变量time虽然没有初始化,但也必须在类外进行定义。由于没有生成CPublic类的实例,所以它的构造函数和析构函数都不会被执行,在里面做什么工作都没有什么意义。

③如果静态函数需要访问CPublic类内的变量,这些变量也必须为静态的。因为非静态量在不生成实例时都不会存在。如:

classCPublic
{
public:
intx;//内部变量
staticintf(inty)//全局函数
{
x++;
returnx;
};
…………
};
这里x虽为类内成员,但如果不生成CPublic类的实例,就会出现函数f()存在,而变量x不存在的问题。

总之,用没有实例的类管理全局量是一个不错的选择,它具有集中管理,使用方便的好处。当然,除非特别必要,全局量还是少用为好,一个好的编程者决不会随意滥用全局量的,一个封装做得不好的程序,在修改维护时会让你吃足苦头。
<!-- 正文结束 -->
分享到:
评论

相关推荐

    VC中如何定义全局变量VC中如何定义全局变量VC中如何定义全局变量VC中如何定义全局变量VC中如何定义全局变量

    VC中如何定义全局变量VC中如何定义全局变量VC中如何定义全局变量VC中如何定义全局变量VC中如何定义全局变量VC中如何定义全局变量VC中如何定义全局变量VC中如何定义全局变量VC中如何定义全局变量VC中如何定义全局变量...

    VC中的全局变量.doc

    介绍VC++中的全局变量的定义和用法,建立良好编程习惯,慎用全局变量。

    在MFC下如何定义全局变量和全局函数

    本文件描述了在MFC下如何定义全局变量和全局函数,这样所有的对话框均可放到到。

    [VC]在MFC下如何定义全局变量和全局函数

    用MFC制作的工程由很多文件构成,它不能象一般C++程序那样随意在类外定义全局变量,在这里要想定义能被工程内多个文件共享的全局变量和函数必须用一些特殊方法才行。实际上有多种方法可以实现,这里只介绍两种方法。

    C++ 编译单元概述和全局变量的声明和定义

     一个,链接时的错误,主要是重复定义变量等。  编译单元指在编译阶段生成的每个obj文件。  一个obj文件是一个编译单元。  一个.cpp(.c)和它相应的.h文件共同组成了一个编译单元。  一个工程由很多编译...

    解析VC中创建DLL,导出全局变量,函数和类的深入分析

    添加包含要导出的全局变量,函数和类的头文件MathLib.h: 代码如下: //MathLib.h #pragma once #ifdef MATHLIB_EXPORT #define MATHLIBAPI __declspec(dllexport) #else #define MATHLIBAPI __declspec...

    基于C++全局变量的声明与定义的详解

    (1)编译单元(模块)在VC或VS上编写完代码,点击编译按钮准备生成exe文件时,编译器做了两步工作:第一步,将每个.cpp(.c)和相应的.h文件编译成obj文件;第二步,将工程中所有的obj文件进行LINK,生成最终.exe文件...

    VC学习大纲 VC学习讲义

    VC工程的编译原理与过程,将工程中不同的类拆分到不同的原文件中,每一个类由一个.h和.cpp文件共同完成,然后解决头文件重复定义问题,培养了学员良好的编程习惯,也为以后分析MFC Appwizard生成的工程奠定了良好...

    用VC实现矩阵的逆的求解

    用VC语言实现代数矩阵逆的求解,矩阵的阶数定义为全局变量,只要改变它的值,就可以实现任意阶数矩阵逆的求解。

    VC 利用MFC类创建互斥对象,源码免费下载.rar

    VC 使用MFC类创建互斥对象,通过这个小程序,你可以了解到声明线程函数、定义全局互斥对象、定义线程句柄、创建线程、程序睡眠、锁定互斥对象、变量自加、线程睡眠、释放互斥对象、线程正常退出等相关基础知识。

    一个可用供VB、VC调用的摄像头视频捕捉DLL

    定义全局函数引用: typedef HWND(* CreateWnd)(void);// typedef HRESULT(* InitStillGraph)(HWND hwnd); typedef void (* OnpStillCapture)(HWND hwnd); typedef int (* ClearGraphs)(); HINSTANCE glibsample; //...

    VC++使用串口控件实现温度数据采集并显示

    串口控件说明:  本程序使用VC6.0的通用串口控件MSCOMM32.OCX来对发送到串口的数据进行采集处理...只要当全局变量中的数值发生变化后就使用函数this-&gt;Invalidate()强制重载OnPaint()函数,那么数据图就可以动起来了。

    一种VC++全局函数实现方法举例

    内容索引:VC/C++源码,其它分类,全局函数 一种VC++全局函数实现方法举例,全局函数不管是在WEB编程或是WinForm编程,都带来很多方便之处,它可以将一些常用的变量或常量保存在全局函数中,程序不需要调用头文件就...

    C语言程序设计标准教程

    对于用户自定义函数, 不仅要在程序中定义函数本身, 而且在主调函数模块中还必须对该被调函数进行类型说明,然后才能使用。 2. C语言的函数兼有其它语言中的函数和过程两种功能,从这个角度看,又可把函数分为有...

    VC++常用功能实例

    ◆如何使用全局变量◆ 26 ◆如何让一个字符加上回车、换行◆ 26 ◆如何定义、使用结构◆ 26 ◆如何在任意程序中显示MessageBox◆ 27 ◆如何在程序判断出debug状态◆ 27 ◆当对话框中有一个滚动条是,当滚动滚动条时...

    typeof_common.zip_Boost_boost vc6_msc.dll_typeof

    笔者最近作一个项目时需要用比较hack的手段把第三方的dll(无lib但有头文件)里面的外部函数以函数指针的方式提取出来给其他模块作全局变量用,500多个函数呀,声明函数指针可不是个轻松事,类型名字至少排满一行,写了50...

    一个VC++低层的BMP图像读写程序

     定义全局变量主要为了后面的图像数据访问及图像存储作准备。虽然本程序代码文件挺少,但内部的几个函数确实够实用:  函数名称:readBmp()  函数参数:char *bmpName -文件名字及路径  返回值:0为失败,1为成功...

    C++ 使用CMutex 类实现线程同步

    C++ 使用CMutex 类实现线程同步,将了解到声明线程函数,定义全局变量m_Sec,程序睡眠10秒,锁定临界区,对临界区进行解锁,输出变量等知识点。

    C++静态成员变量和静态成员函数的使用方法总结

    静态数据成员实际上是类域中的全局变量。所以,静态数据成员的定义(初始化)不应该被放在头文件中。 其定义方式与全局变量相同。举例如下: xxx.h文件 class base{ private: static const int _i;//声明,标准c++...

    CMINUS 编译器

    C语言实现,VC 6.0 下调试通过。...在globals.h中定义了一些全局变量和全局函数; 在 scan.h 中定义了一些Lex工具需要使用的变量和函数原型; 在 util.c 中实现了printToken 来向屏幕上打印记号序列 ...

Global site tag (gtag.js) - Google Analytics