c语言中,全局变量是一个非常重要的概念。全局变量定义在函数外,可以被所有的函数共同使用。

#include <iostream>

;

void display()
{
    printf("%d", x);
    x++;
    printf("\n");
}

int main(int argc, char* argv[])
{
    display();
    printf("%d", x);
    printf("\n");
    system("pause");
}

上述例子中 int x = 10; 是对一个全局变量的定义,他的作用域是从定义的位置开始一直到文件的末尾。

当然,针对全局变量而言,我们没必要非要将他定义在文件的开始的位置,要在定义之前使用它,那么就需要声明。对比上述代码,也可以这么写:

#include <iostream>

void display()
{
    extern int x;
    printf("%d", x);
    x++;
    printf("\n");
}

extern int x;
int main(int argc, char* argv[])
{
    display();
    printf("%d", x);
    printf("\n");
    system("pause");
}

;

上例中,第一个extern int x; x的作用域是从声明开始到display函数结束,而第二个extern int x 的作用域是从声明开始到文件结束。当然,即便你重复声明一个变量也不要紧,只要声明了就可以用,而所用的x都是在下边定义的那个全局变量x。c编译的原则是可以随便多次声明但是绝不可以多次定义。

extern关键字的作用远不止单个文件这么简单。我们创建另一个源文件,只有一行代码:

;

此时我们将两个文件同时编译,果断出错了。理由很简单:x被重定义,当你使用x这个全局变量的时候,将不知道会使用哪个。即便你将声明用的extern关键字去掉也无济于事。

这就说明上述全局变量的定义是贯穿整个工程的,那么当工程庞大的时候,很有可能就会需要不同文件下有相同的全局变量名称。这个时候static关键字的作用就来了。

我们在新建的源文件定义x的时候前边加上static关键字:

;

然后编译就能通过了。因为static的作用是所在的文件中才会使用定义的全局变量。此时我们修改新文件:

#include <iostream>
extern int x;

void display2()
{
    printf("%d", x);
    printf("2\n");
}

;

然后我们在另一个源文件调用这个display2,因为是全局函数,所以调用前和变量一样声明一下就好了:

int main(int argc, char* argv[])
{
    extern void display2();
    display2();
    printf("%d", x);
    printf("\n");
    system("pause");
}

我们发现display2打印的是20,和main所在文件中的x是两个x。

C语言中的static和extern的更多相关文章

  1. C语言中:static与extern对变量和函数的作用

    1.两者对全局变量 static对全局变量,表示定义一个内部变量 extern对全局变量,表示声明一个外部变量 说明: 1.内部变量:定义的变量只能在本文件中访问,不能被其他文件访问. 2.不同文件中 ...

  2. C语言中的static的作用?

    在C语言中,static的字面意思很容易把我们导入歧途,其实它的作用有三条. (1)第一个作用:隐藏. 当我们同时编译多个文件时,所有未加static前缀的全局变量和函数都具有全局可见性.为理解这句话 ...

  3. 转:C语言中的static变量和C++静态数据成员(static member)

    转自:C语言中的static变量和C++静态数据成员(static member) C语言中static的变量:1).static局部变量        a.静态局部变量在函数内定义,生存期为整个程序 ...

  4. C语言中的static 详细分析

    转自:http://blog.csdn.net/keyeagle/article/details/6708077/ google了近三页的关于C语言中static的内容,发现可用的信息很少,要么长篇大 ...

  5. C语言中的static 具体分析

    google了近三页的关于C语言中static的内容,发现可用的信息非常少,要么长篇大论不知所云要么在关键之处几个字略过,对于想挖掘底层原理的刚開始学习的人来说參考性不是非常大.所以,我这篇博文博採众 ...

  6. C语言中的static关键字

    C语言代码是以文件为单位来组织的,在一个源程序的所有源文件中,一个外部变量(注意不是局部变量)或者函数只能在一个源程序中定义一次,如果有重复定义的话编译器就会报错.伴随着不同源文件变量和函数之间的相互 ...

  7. 【转载】C语言中的static 详细分析

    原blog地址:http://blog.csdn.net/keyeagle/article/details/6708077/ google了近三页的关于C语言中static的内容,发现可用的信息很少, ...

  8. [整理]C语言中的static静态对象

    1.说明外部对象(静态外部变量和静态函数)    (1)static 用于说明外部变量或函数,使该对象的作用域限定为被编译原文件的剩余部分,即从对象说明开始到所在源文件的结束部分:    (2)被st ...

  9. C语言中,static关键字作用

    static修饰变量 1 在块中使用static修饰变量 它具有静态存储持续时间.块范围和无链接. 即作用域只能在块中,无法被块外的程序调用:变量在程序加载时创建,在程序终止时结束. 它只在编译时初始 ...

随机推荐

  1. java项目文件的路径问题

    title: 项目下的路径问题 tags: grammar_cjkRuby: true --- 在javaee的项目中,存取文件,解析xml和properties文件,以及项目中的文件,都需要获取路径 ...

  2. 点阵字体显示系列之一:ASCII码字库的显示

    http://blog.csdn.net/subfate/article/details/6444578 起因: 早在阅读tslib源代码时就注意到里面有font_8x8.c和font_8x16.c两 ...

  3. Docker入门(七):部署app

    这个<Docker入门系列>文档,是根据Docker官网(https://docs.docker.com)的帮助文档大致翻译而成.主要是作为个人学习记录.有错误的地方,Robin欢迎大家指 ...

  4. 微软开业网站----精华 http://www.microsoft.com/opensource/directory.aspx

    http://www.microsoft.com/opensource/directory.aspx

  5. day8 服务器

    XML约束 XML约束要求:大家能够看懂约束内容,根据约束内容写出符合规则的xml文件. 2.1 引入 XML语法: 规范的xml文件的基本编写规则.(由w3c组织制定的) XML约束: 规范XML文 ...

  6. JAVA企业级开发-jdbc入门(09)

    一. jdbc介绍 JDBC全称为:Java DataBase Connectivity(java数据库连接). SUN公司为了简化.统一对数据库的操作,定义了一套Java操作数据库的规范,称之为JD ...

  7. 死磕 java同步系列之JMM(Java Memory Model)

    简介 Java内存模型是在硬件内存模型上的更高层的抽象,它屏蔽了各种硬件和操作系统访问的差异性,保证了Java程序在各种平台下对内存的访问都能达到一致的效果. 硬件内存模型 在正式讲解Java的内存模 ...

  8. SpringMVC中的常用注解

    RequestParam 作用: 用于  将请求参数区数据  映射到  功能处理方法的参数上. 属性: value  请求参数中的名称 required   请求参数中是否必须提供此参数. 默认值: ...

  9. gulp --watch直接退出,并没有监听

    1.在es6(彩票项目)搭建环境时遇到gulp --watch 只运行一次就退出了不能监听: D:\nodejs\es6-base>gulp --watch [::] Failed to loa ...

  10. codevs1051接龙游戏

    1051 接龙游戏