Pages

mardi 17 août 2010

Static and Extern 的用法

extern与static用法小结
 
1.作用域:
(1)代码块作用域:一般我们在函数内定义的没加关键字的变量就是代码块作用域,如:
int main()
{
   int i,j;
   .....
}
一个代码块是包含在开始花括号和对应的结束花括号之内的一段代码。
(2)函数原型作用域
(3)文件作用域.(可以在多个函数中使用的)

2.链接
链接分为外部链接和内部链接。
实际上能用extern声明引用的就是能外部链接
而在变量或函数前加关键字static的就成了静态,如果是声明的全局变量且有static修饰,
也就成了内部链接的属性了.

3.static
static为静态之意,也就是在一个文件(多个函数构成的一个文件)运行期间都会存在。
用它实际上起到两个作用:
  • 生存周期,使得在整个文件内都存在;
  • 限定作用域,使得全局变量或是函数(也就成了内部函数)只能在本文件内可见(这也正是与extern相反之处).

static int j = 0; //只有本文件内可用
void function()
{
         static int test = 0;//只有在function内是可见的
         test++;
         ..........
}
int main()
{
        int i = 5;
         while(i--) {
         function();
           ..................
         }

}
运行程序时,test最开始就会分配空间,
实际上在a标记的地方并不是函数function的一部分。程序运行时看起来路过了那一步。
因为静态变量和外部变量在程序调入内存时已经就位了.
作用于函数时,只是限定它只在本文件内有效。
4.extern
一般定义的函数和变量都是外部链接性的。对于声明和定义的区别
int tern = 1;
int main()
{
      extern int tern;
          .................
}
tern声明了两次。第一次声明为变量留出了存储空间,为变量的定义,为定义声明;
第二次声明只是告诉编译器要使用先前定义的变量tern,为引用声明

如果:
extern int tern;
void main()
{}
则告诉编译器真正定义在程序中的其它地方.
不要用关键字extern来进行外部定义,只用它来引用一个已经存在的外部定义,
也就是引用声明.
如:extern char per = 'y'; //这是错误的

因为extern的存在标志这是一个引用声明,而非定义声明.

Aucun commentaire:

Enregistrer un commentaire