和该文件属于同一程序的其他文件可以使用变量giants,变量dodgers是该文件私有的,但是可以被该文件中的任一函数使用。
2、存储时期一个C变量有以下两种存储时期之一:静态存储时期和自动存储时期。如果一个变量具有静态存储时期,它在程序执行期间将一直存在。具有文件作用域的变量具有静态存储时期。注意对于具有文件作用域的变量,关键词static表明链接类型,并非存储时期。一个使用static声明了的文件作用域变量具有内部链接,而所有的文件作用域变量,无论它具有内部链接,还是具有外部链接,都具有静态存储时期。具有代码块作用域的变量一般情况下具有自动存储时期,在程序进入定义这些变量的代码块时,将为这些变量分配内存;当退出这个代码块时,分配的内存将被释放。
5个存储类 存储类 时期 作用域 链接 声明方式 自动 自动 代码块 空 代码块内 寄存器 自动 代码块 空 代码块内,使用关键字register 具有外部链接的静态 静态 文件 外部 所有函数之外 具有内部链接的静态 静态 文件 内部 所有函数之外,使用关键字static 空链接的静态 静态 代码块 空 代码块内,使用关键字static 如果在内层代码块定义了一个具有和外层代码块变量同一名的变量,那么在内层代码块定义的名字是内层代码块内使用的变量,我们称之为内层定义覆盖了外部定义,但当运行离开内层代码块时,外部变量重新恢复作用。如:
上面代码中,创建了4个独立的变量,main()中的Hocus默认为自动变量,而且是main()的局部变量,magic()中的Hocus被显式第声明为自动变量,只对magic()可见。外部变量Hocus对main()或magic()不可见,但对文件中其他不单独用于局部Hocus的函数都可见。最后,Pocus是一个外部变量,对magic()可见而对main()不可见,因为Pocus的声明在main()之后。
3、外部变量初始化不同与自动变量的是,如果您不对外部变量进行初始化,它们将自动被赋初值0,这一原则也使用于外部定义的数组元素。不同于自动变量,只可以用常量表达式来初始化文件作用域变量:
因为关键字extern的存在标志着这是一个引用声明,而非定义声明。
5、存储类说明符5个:auto、register、static、extern以及typedef。自动变量具有代码块作用域、空链接和自动存储时期。它们是局部的,为定义它们的代码块(通常为一个函数)所私有。寄存器变量与自动变量具有相同属性,但编译器可能使用速度更快的内存或寄存器来存储它们。无法获取一个寄存器变量的地址。具有静态存储时期的变量可能具有外部链接、内部链接或空链接。当变量在文件的所有函数之外声明,它是一个具有文件作用域的外部变量,具有外部链接和静态存储时期。如果在这样的声明中再加上关键字static,将获得一个具有静态存储时期、文件作用域和内部链接的变量。如果在一个函数内使用关键字static声明变量,变量将具有静态存储时期、代码块作用域和空链接。
posted on 2011-03-13 10:02 八路 阅读(206) 评论(0) 编辑 收藏 引用 所属分类: C primer 易错点
Powered by: C++博客 Copyright © 八路