C++中全局变量的那些事儿
C/C++中的变量分为全局变量、静态全局变量、局部变量和静态局部变量,在《C/C++中静态局部变量的特点与应用》中我们介绍过静态局部变量,今天我们的目标是全局变量。
单个文件中的全局变量
简单一点说,全局变量就是在函数外面定义的变量,下面是一个最简单的实例,一共定义了两个int型的全局变量a和b,这两个全局变量定义的位置不大相同,a定义在函数fun1之前,而b定义在之后,a和b都定义在函数main之前,从使用情况看全局变量a可以在其后面的所有函数中使用,而全局变量b只能在函数main中使用,不能在其定义之前的函数fun1中使用。因此,我们可以得出这样的结论:全局变量的作用域为其定义位置开始,至文件结尾,也即只有文件作用域。
#include “stdio.h”
int a = 1; //这就是个全局变量啦
void fun1() //这个函数只能使用全局变量a,不能用b
{
a++;
printf(“a=%d\n“,a);
}
int b = 2; //这也是个全局变量
void main() //这里a b都可以用
{
fun1();
a++;
printf(“a=%d,b=%d\n“,a,b);
getchar();
}
让全局变量在多个文件中有效
前面讲过,全局变量的作用域起始于定义的地方直到文件结尾,那岂不是就没法在其他文件中使用了啊。从C/C++现在NB的程度上看,这个事情是不可能的,要是这样那还了得。为了使全局变量的作用域扩大到多个文件中,C++中提供了extern关键字。
下面实例代码中的extern int g_c;是做一个声明,说这个变量g_c是一个全局变量啊,你们随便用,g_c本身在其他文件中定义(在本文件中定义也可以,不过要保证其他文件中没有定义过),这样就将全局变量的作用域扩大到多个文件了。
全局变量只要在一个文件中定义后,在其他需要使用的源文件中只要使用extern关键字,即可在该文件中使用,概括下就是:extern扩展全局变量的作用域
#include “stdio.h”
extern int g_c; //声明这是一个外部全局变量
int g_a = 1; //全局变量
void fun1()
{
g_a++;
printf(“g_a=%d,g_c=%d\n“,g_a,g_c);
}
int g_b = 2; //全局变量
void main()
{
fun1();
g_a++;
printf(“g_a=%d,g_b=%d,g_c=%d\n“,g_a,g_b,g_c); //这里直接就用上g_c了
getchar();
}
上做了一点小小的更改,把所有的全局变量全部加上g_前缀,用以表示这是一个全局变量。
限制全局变量只能在一个文件中有效
刚才好不容易才把全局变量的作用域扩展到多个文件了,干嘛现在又要限制呢?这是因为虽然全局变量定义后不使用extern关键字的话只能在本文件中使用,但是如果你在其他文件中定义同样名字的全局变量的话,那是不允许滴(在链接的时候会出错),至于详细原因以后再说。
为了能够实现在不同的文件中使用相同名字的全局变量,static关键字就派上用场了,在C/C++中静态局部变量的特点与应用中我们已经说过static关键字了,用static修饰的局部变量只能在定义变量的函数中使用,那么用static修饰的全局变量也就只能在定义其的文件中使用了,这就是传说中的静态全局变量。
extern int g_c; //其他文件中定义的全局变量
static int g_a = 1; //静态全局变量 限本文件中使用
void fun1()
{
g_a++;
printf(“g_a=%d,g_c=%d\n“,g_a,g_c);
}
int g_b = 2; //全局变量
void main()
{
fun1();
g_a++;
printf(“g_a=%d,g_b=%d,g_c=%d\n“,g_a,g_b,g_c);
getchar();
}
通过static修饰后,我们就可以在不同的文件中使用相同名字的全局变量而不会出现链接错误了。
原创文章请注明转载于知蚁博客,本文地址:http://www.letuknowit.com/archives/87
C++中全局变量的那些事儿的更多相关文章
- 总结iOS开发中的断点续传那些事儿
前言 断点续传概述 断点续传就是从文件赏赐中断的地方重新开始下载或者上传数据,而不是从头文件开始.当下载大文件的时候,如果没有实现断点续传功能,那么每次出现异常或者用户主动的暂停,都会从头下载,这样很 ...
- python中全局变量和局部变量的一个小坑
python 中全局变量和局部变量在使用过程中的一个容易出错的地方 什么是全局变量 python中,在函数外部声明的变量可以叫做全局变量. x = 10 def fn1(): pass fn1() 什 ...
- ajax实现给JavaScript中全局变量赋值(转)
原文地址:ajax实现给JavaScript中全局变量赋值 问题简化: <script type="text/javascript"> var a=1 ; functi ...
- PHP中全局变量global和$GLOBALS[]的区别分析
$GLOBALS['var']是外部的全局变量本身,global $var是外部$var的同名引用或者指针 一.举例比较 例一: 复制代码 代码如下: <?php $var1 = 1; ...
- PHP和JS中全局变量和局部变量
一,PHP中全局变量和局部变量 php与C++中对全局变量和局部变量定义类似,全局变量:函数外定义的变量,在全局通用:局部变量:在函数内定义的变量,只在函数内有效.PHP中变量范围跨越了include ...
- Python 中全局变量的实现
一.概述 Python 中全局变量的使用场景不多,但偶尔也有用武之处. 如在函数中的初始化,有时需要从外部传入一个全局变量加以控制.或者在函数中,使用连接池时,也可能有使用全局变量的需要. 广义上的全 ...
- Go语言 进程、线程、轻量级进程、协程和go中的Goroutine 那些事儿
原文:http://www.cnblogs.com/shenguanpu/archive/2013/05/05/3060616.html 电话面试被问到go的协程,曾经的军伟也问到过我协程.虽然用py ...
- VUE中全局变量的定义和使用
目录 VUE中全局变量的定义和使用 1.工作中遇到的两类问题 1.1 状态值(标志) 1.2 传递字段 2.解决方法 2.1 VUEX 2.2 使用全局变量法管理状态与字段值 3.具体实现 3.1创建 ...
- php中全局变量global和超全局变量$GLOBALS
php中全局变量global和超全局变量$GLOBALS 1.global Global的作用是定义全局变量,但是这个全局变量不是应用于整个网站,而是应用于当前页面,包括include或require ...
随机推荐
- mysql 的数据类型
mysql 的数据类型(描述的是字段)三大类:一.整型:1.tinyint(M),其中M是显示宽度,需要配合zerofill,就是前面0填充,存储单位为1个字节(8位),无符文是最大能存储范围0000 ...
- roscpp源码阅读
roscpp doxgen 这只是我摘取的一些主要代码 node_handle.cpp //NodeHandle的构造函数 void NodeHandle::construct(const std:: ...
- OpenWRT 路由配置技巧
随着最近 Google 在国内已经完全无法访问,使得通过 VPN 访问网络的需求更加强烈,本文介绍的方法可以使一个普通的路由具备稳定连接 VPN 的能力,并能够根据目标访问网站选择国内外线路,从而得到 ...
- vim中执行shell命令小结
vim中执行shell命令,有以下几种形式 1):!command 不退出vim,并执行shell命令command,将命令输出显示在vim的命令区域,不会改变当前编辑的文件的内容 例如:!ls -l ...
- [转]一个基于完成端口的TCP Server Framework,浅析IOCP
[转]一个基于完成端口的TCP Server Framework,浅析IOCP http://www.cppblog.com/adapterofcoms/archive/2010/06/26/1187 ...
- UIViewController没有随着设备一起旋转的原因
对于iPhone app,UIViewController类提供了基本的视图管理模式.当设备改变方向的时候view controller的视图会自动随之旋转的.如果视图和子视图的autoresizin ...
- 101个MySQL的调节和优化的Tips
MySQL 是一个功能强大的开源数据库.随着越来越多的数据库驱动的应用程序,人们一直在推动MySQL发展到它的极限.这里是101条调节和优化MySQL安装的技巧.一些技巧是针对特定的安装环境的,但这些 ...
- VS查看工程项目代码行数
ctrl+shift+F 查找选项选正则表达式 正则表达式 b*[^:b#/]+.*$或 ^b*[^:b#/]+.*$
- 原生js实现仿window10系统日历效果
舞动的灵魂版js日历,完全采用js实现,故而实现了与语言无关,jsp.asp.net php asp均可使用.无论你是开发软件,还是网站,均是不可或缺的实用代码. 该日历主要实现了获取当前时间时分秒, ...
- SharePoint 优化显示WebParts
在开发sharepoint中,经常遇到需要自定义显示列表中的一部分作为导航的内容, 如公告栏,新闻链接,最新动态等.... 我们通常需要显示一个列表的标题,并且限制字符长度, 外加一些条件,如按创建的 ...