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. Javascript Tip(!!)

    var a:var b=!!a; a默认是undefined.!a是true,!!a则是false,所以b的值是false,而不再是undefined,也非其它值,主要是为后续判断提供便利. !!一般 ...

  2. asp.net mvc Model验证总结及常用正则表达式【转载】

    关于Model验证官方资料: http://msdn.microsoft.com/zh-cn/library/system.componentmodel.dataannotations.aspx AS ...

  3. CF-811B

    B. Vladik and Complicated Book time limit per test 2 seconds memory limit per test 256 megabytes inp ...

  4. 转:JDBC Request使用方法

    1.   下载mysql jar包 下载mysql jar包 http://dev.mysql.com/downloads/connector/j/ 网盘下载地址:mysql-connector-ja ...

  5. 《Java多线程编程核心技术》读后感(十六)

    线程组 线程组的作用是,可以批量的管理线程或线程组对象,有效地对线程或线程组对象进行组织 线程对象关联线程组:1级关联 package Seven; public class ThreadA exte ...

  6. 1.14不使用回车键来读取n个字符

    read是一个重要的bash命令,它用于从键盘或标准输入中读取文本.可以使用read以交互的形式读取来自用户的输入,不过read能做的远不止这些.很多编程语言的输入库都是从键盘读取输入,且只有回车键按 ...

  7. 面试问题 ---C#中的委托

    一.C#委托是什么的? 在正式介绍委托之前,我想下看看生活中委托的例子——生活中,如果如果我们需要打官司,在法庭上是由律师为我们辩护的,然而律师真真执行的是当事人的陈词,这时候律师就是一个委托对象,当 ...

  8. 4.xpath注入详解

    0x01 简介 XPath注入攻击是指利用XPath 解析器的松散输入和容错特性,能够在 URL.表单或其它信息上附带恶意的XPath 查询代码,以获得权限信息的访问权并更改这些信息.XPath注入发 ...

  9. Jsoncpp写“鱘”的json数据,报错。

    最近在用Json::FastWriter生成json数据时,发现一个问题.含有“鱘”字的json字段会多出一个斜杠,不知道是不是编码的问题. C++要使用JSON来解析数据,一般采用jsoncpp. ...

  10. ue4学习资料

    官网中文 https://docs.unrealengine.com/latest/CHN/index.html 官网英文 https://docs.unrealengine.com/latest/I ...