C++中全局变量的那些事儿

 C/C++中的变量分为全局变量、静态全局变量、局部变量和静态局部变量,在《C/C++中静态局部变量的特点与应用》中我们介绍过静态局部变量,今天我们的目标是全局变量。

单个文件中的全局变量

  简单一点说,全局变量就是在函数外面定义的变量,下面是一个最简单的实例,一共定义了两个int型的全局变量a和b,这两个全局变量定义的位置不大相同,a定义在函数fun1之前,而b定义在之后,a和b都定义在函数main之前,从使用情况看全局变量a可以在其后面的所有函数中使用,而全局变量b只能在函数main中使用,不能在其定义之前的函数fun1中使用。因此,我们可以得出这样的结论:全局变量的作用域为其定义位置开始,至文件结尾,也即只有文件作用域

C++语言: 知蚁博客

#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扩展全局变量的作用域

C++语言: 知蚁博客

#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修饰的全局变量也就只能在定义其的文件中使用了,这就是传说中的静态全局变量。

C++语言: 知蚁博客

#include “stdio.h”

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

时间: 2024-08-02 06:54:58

C++中全局变量的那些事儿的相关文章

总结iOS开发中的断点续传那些事儿

前言 断点续传概述 断点续传就是从文件赏赐中断的地方重新开始下载或者上传数据,而不是从头文件开始.当下载大文件的时候,如果没有实现断点续传功能,那么每次出现异常或者用户主动的暂停,都会从头下载,这样很浪费时间有木有.所以呢,项目中实现大文件下载的时候,断点续传功能是必不可少了.当然咯,断点续传有一种特殊的情况,就是我们的应用呗用户kill掉或者应用crash,要实现应用重启之后的断点续传,这种情况就是我们将要解决的问题. 断点续传的原理 要实现断点续传,服务器必须是要支持的.目前最常见的两种方式

SEO中常忽略的事儿 你遇到了吗?

SEO中常忽略的事儿 你遇到了吗?SEO是一项艰巨而富有挑战的任务,你付出了很多努力,却不一定收到效果.为什么会这样呢?除了外部的因素与自身条件之外,还存在一些平日你不曾留意的细节影响所致. 只顾埋头苦干 却忘记抬头看路 文章原创.内链布局.外链建设--当站长们醒来的那一秒,他们的脑子里兴许就会蹦出这些词语.对于一个网站,这类看似的常规工作是非常重要的.但是,当我们埋头苦干的时候,却常常忘记抬头看路,错过了网站发展的光明大道.而我之前就出现过类似的情况. 当时我在负责网站的体育频道,虽然每天流量

php中全局变量详解

php中全局变量列表: $GLOBALS $_SERVER $_REQUEST $_POST $_GET $_FILES $_ENV $_COOKIE $_SESSION 1.$GLOBALS可将$GLOBALS['a']中php变量a转化成全局变量! 例如: <?php  $x = 75;  $y = 25;   function addition() {    $GLOBALS['z'] = $GLOBALS['x'] + $GLOBALS['y'];  }   addition();  e

servlet 中全局变量的使用

在servlet中定义全局变量的时候,开发者最关心的就是多用户同时操作是,servlet是单例还是多例了,多例的话,全局变量没有任何问题,如果是单例的话,那么全局变量的值就会影响到其他用户.servlet是单例多线程. (网上对于servlet是否是单例多例的说法:servlet 常用的两种有在web.xml 中声明,以及实现SingleThreadModel方式.web.xml 里声明几次,就会有几个实例:SingleThreadModel:官方已经废弃,最多有20个实例): 下面说说单例多线

一个so库中全局变量未定义引起的问题

libspero.so库中,先是在a.cpp中定义了全局变量m; 在b.cpp中使用extern int m;后使用,后来删了a.cpp中m的定义,忘记删除b.cpp中m的使用了,结果libspero.so编译没有任何报警,运行后总是crash,跟踪后发先GOT表项中保存的值是非法内存访问区! 这个报错表面上看起来跟b.cpp没有任何关系,调了一天,巨坑巨坑!

js中全局变量的一点小知识点

js中有三种方式定义全局变量: 在任何函数外面直接执行var语句,例如:var f="value"; 直接添加一个属性到全局变量上,在web浏览器中,全局对象名为window.例如:window.f="value"; 直接使用未经过声明的变量,以这种方式定义的全局变量成为隐式的全局变量.例如:f="value"; 尽可能少使用全局变量: 其中一种方法就是将他们添加到同一个命名空间去:例如: 1 var My={}; 2 My.name={ 3 &

nodejs中全局变量

1.global 类似于客户端javascript运行环境中的window module1.js: module.exports={}; //耻辱的使用了全局变量 global.varA = "abc"; 关于global对象,实际使用中可以省去global. 他是默认的根作用域,相当于web环境中的window对象. global 对象有几个挺有用的属性: console.log(__dirname);//当前路径 console.log(__filename);//当前在执行的js

[Unity-19] Unity中全局变量的赋值过程

使用Unity开发的朋友可能会遇到这样一个问题,那就是我在脚本中定义了一个公共全局变量并且赋值,但是运行后发现这个变量并不是这个值,这里就给大家解释一下原因. 代码如下: public class Test : MonoBehaviour { public int a = 10; void Awake() { a = 20; } void Start () { a = 30; } } 由于是public类型,所以变量a会在Unity面板中显示出来,如下图: 那么这个变量a的赋值顺序是怎样的呢?

C++中全局变量的声明和定义

原文链接:http://blog.csdn.net/candyliuxj/article/details/7853938 (1)编译单元(模块) 在VC或VS上编写完代码,点击编译按钮准备生成exe文件时,编译器做了两步工作: 第一步:将每个.cpp和相应的.h文件编译成obj文件: 第二步:将工程所有的obj文件进行Link,生成最终的.exe文件. 这样,错误可能在两个地方产生: 一个是在编译的时候发生的错误,主要是语法错误: 一个是在链接的时候的错误,主要是重复定义变量等. 编译单元指在编