c/c++中静态局部变量以及全局变量的使用(转)

c/c++中的变量分为全局变量和静态全局变量,局部变量和静态局部变量。本文主要讲静态局部变量。

静态局部变量首先是一个局部变量,加上静态后,生存期就被延长了,不会随着函数的返回而被撤销,我们可以这样理解,静态局部变量就是程序生存期间一直有效,但只能在定义它的函数中使用的一种变量。

静态局部变量的声明比较简单,在声明局部变量的时候,加上关键字static就可以了。下面是一个用局部静态变量计算阶乘的具体例子。

实例1:  

#include "stdio.h"

int fac(int n)
{
    static int nRet = 1;    //静态局部变量

    nRet *= n;

    return nRet;
}

void main()
{
    for(int i=1;i<5;i++)
    {
        printf("%d!=%d\n",i,fac(i));
    }
    getchar();
}

在第一次调用函数fac的时候,函数fac中的静态局部变量nRet被初始化为1,如果没有默认指定初始化值得话,会被默认初始化为0. 主函数main中共进行了4次fac函数的调用:

  第一次调用:初始化nRet为1 函数返回时:nRet=1

  第二次调用时: nRet=1  函数返回时:nRet=2

  第三次调用时: nRet=2  函数返回时:nRet=6

  第四次调用时: nRet=6  函数返回时:nRet=24

可以看出,静态局部变量在第一次调用的时候进行初始化,每次函数调用后,静态局部变量不会像局部变量那样被立即释放,而是继续有效,在下一次函数调用的时候会继续使用上一次的值。

实例2:

#include <iostream>
using namespace std;
int add(int b,int a)
{
 static int z=1;
 z=b+a+z;
 return z;
}
void main( )
{  int a=1,b=2,x1,x2,x3;
 x1=add(a,b);//4
 x2=add(add(a,b),b);//16
 x3=add(a,b);//18
 cout<<x1<<'\n'<<x2<<'\n'<<x3<<endl;
}

以下是对全局变量的使用(转):

例子:

头文件:state.h    源文件:state.cpp       

 其它源文件:t1.cpp   t2.cpp  t3.cpp,  这些源文件都包含头文件state.h。

需要定义一个全局变量供这些源文件中使用:方法如下

1、在 state.h声明全局变量: extern int a;

2、在state.cpp中定义该全局变量:int a = 10;

这样其它源文件就可以使用该变量啦

  

这里需要的是“声明”,不是“定义”!根据C++标准的规定,一个变量声明必须同时满足两个条件,否则就是定义:  
  (1)声明必须使用extern关键字;(2)不能给变量赋初值    
  extern   int   a;   //声明 


  int   a;   //定义

  int   a   =   0; //定义

  extern   int   a   =0;   //定义

 

      头文件中应使用extern 关键字声明全局变量(不定义),如果这个变量有多个文件用到,可以新建一个cpp,在其中定义,把这个cpp加入工程即可。头文件请不要定义任何变量,那是非常业余的行为……

    一般在头文件中申明,用extern, 在cpp中定义。 如果在头文件中定义,如果这个头文件被多个cpp引用,会造成重复定义的链接错误。

    头文件只能申明全局变量(extern),不可定义(不推荐使用)     .cpp里,在最外层定义即可(int gi),直接引用

例子(自测)

class2.h
#pragma once
#include <iostream>
using namespace std;
class class2
{
public:
	class2(void);
	~class2(void);
	int increse2();
};
extern int count;
若把class2.h中的声明去掉,变成了只在class2.cpp中定义全局变量(即int count = 0;),那么其它包含class2.h的文件在使用这个全局变量时,需要加上声明extern int count;且也只能在函数体中使用!

//总结:一个cpp文件中定义的全局变量,即int count = 0;
//其它包含这个文件对应.h文件的文件要使用这个全局变量需要
//声明它,且也要在函数体中使用

class2.cpp
#include "StdAfx.h"
#include "class2.h"

class2::class2(void)
{
}

class2::~class2(void)
{
}
int count = 0;//全局变量,作用范围在这个源文件中
int class2::increse2()
{
	count++;
	return count;
}
class1.h
#pragma once
#include "class2.h"
class class1
{
public:
	class1(void);
	~class1(void);
	//count++;//这样用不行
	int increse3();
};
class1.cpp
#include "StdAfx.h"
#include "class1.h"
class1::class1(void)
{
}

class1::~class1(void)
{
}
int class1::increse3()
{
	count++;
	return count;
}
// 全局变量的使用.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include "class1.h"
#include "class2.h"
//#include <iostream>
//using namespace std;

//count++;//这样用也不行
//extern count++;//这样用也不行
//extern int count = 3;//这么用会重定义
//count++;//不重定义,光声明也不能这样用
//总结:一个类中声明的全局变量,其它包含这个类的文件对
//这个全局变量的使用需要在函数体中
int _tmain(int argc, _TCHAR* argv[])
{
	class2 A;
	class1 B;
	count++;
	int sum = A.increse2();
	cout << sum << endl;
	int sum1 = B.increse3();
	cout << sum1 << endl;
	system("pause");
	return 0;
}

如果在.cpp里使用static定义,则该变量只在当前cpp文件中有效,在别的文件中无效
在.h里使用static定义,不会进行编译(.h文件不编译),只会在其每个include的cpp文件中包含编译,相当于在.cpp里使用static 定义。


静态全局变量(static)
    注意使用static修饰变量,就不能使用extern来修饰,即static和extern不可同时出现。
    static修饰的全局变量的声明与定义同时进行,即当你在头文件中使用static声明了全局变量,同时它也被定义了。
    static修饰的全局变量的作用域只能是本身的编译单元。在其他编译单元使用它时,只是简单的把其值复制给了其他编译单元,其他编译单元会另外开个内存保存它,在其他编译单元对它的修改并不影响本身在定义时的值。即在其他编译单元A使用它时,它所在的物理地址,和其他编译单元B使用它时,它所在的物理地址不一样,A和B对它所做的修改都不能传递给对方。
    多个地方引用静态全局变量所在的头文件,不会出现重定义错误,因为在每个编译单元都对它开辟了额外的空间进行存储。

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 适合毕业设计、课程设计作业。这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。 所有源码均经过严格测试,可以直接运行,可以放心下载使用。有任何使用问题欢迎随时与博主沟通,第一时间进行解答!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值