首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

C语言的外部变量

C语言的外部变量

C语言的存储类型可分为:extern、auto、static、register。
外部变量定义在函数之外,通过同一个名字对外部变量的所有引用(即使这种引用来自于单独编译的不同函数),实际上都是引用同一个对外部变量的所有引用(C标准中把这一性质称为外部链接)。因此外部变量可以在全局范围内访问。
外部变量的初始化:
    1、初始化表达式必须是常量表达式;
    2、只能初始化一次;
    3、在不进行显示初始化的情况下,外部变量将被初始化为0;
外部变量的作用域:
    1、从声明它的地方开始,到其所在的文件结尾结束;
    2、如果要在外部变量的定义之前使用该变量,或者外部变量的定义与变量的使用不在同一个文件夹中,则必须在相应的变量声明中强制地使用关键字extern
这里要具体的讲一下:一个外部变量在默认的情况下只能在定义它的编译单元内被访问,如果要在别的编译单元内可访问,则需使用关键字extern;若要外部变量只能在同一个编译单元被调用(也即不允许其他编译单元通过extern关键字访问到该变量),则需使用关键字static。很乱是吧!呵呵,看代码:
不加关键字static,在其他的编译单元(test2.c)可以访问到test1.c中的变量。
[cpp] view plaincopy

  • //test1.c
  • int COMMON_VALUE = 100;  

  • //test2.c
  • extern COMMON_VALUE;  

如果test1.c如下所示,则在test2.c是无法访问到的
[cpp] view plaincopy

  • //test1.c
  • static
    int COMMON_VALUE = 100;  


extern和static的属性可以应用在公用头文件中:假设有这样几个文件commonDef.h, test1.c, test2.c. 其中test1.c和test2.c包含公用的头文件commonDef.h.
方法一:
[cpp] view plaincopy

  • //commonDef.h
  • #ifndef __COMMON_DEF_H
  • #define __COMMON_DEF_H

  • static
    int COMMON_VALUE = 100;  

  • #endif


这时候在test1.c和test2.c直接#include"commonDef.h"即可。static关键字保证了包含该头文件的编译单元分别拥有该变量的独立实体,如同在每一个源文件分别定义一次;若不加static,则会造成“redifinition”。
方法二:
[cpp] view plaincopy

  • //commonDef.h
  • #ifndef __COMMON_DEF_H
  • #define __COMMON_DEF_H

  • extern
    int COMMON_VALUE;  

  • #endif

  • //test1.c
  • #include "commonDef.h"
  • int COMMON_VALUE = 100;  

  • //test2.c
  • #include "commonDef.h"


也即在公用头文件中,使用extern关键字。然后再某一个源文件中定义一次,再在每一个使用它的编译单元中包含该头文件即可。
总结:C语言中,外部变量的默认的连接类型是extern, 即外连接。

注意:
将外部变量的声明定义区分开来很重要:
    变量的声明用于说明变量的属性(主要是变量的类型);变量的定义除此之外还要引起存储器的分配。
继承事业,薪火相传
返回列表