c和指针读书笔记——变量的类型和作用域

  • 符号

      符号分为以下三类:

全局符号 在此处定义,可以在其他的文件,其他的位置引用,对应于非static修饰的(局变量和函数定义)。

外部符号 在此处引用,在其他位置定义,对应于其他位置定义的变量和函数。(加extern关键字)。

本地符号 在此处定义,只在本文件中可见,其他文件不能引用。(用static修饰的全局变量和函数定义)。

  • 变量重名

    • 单文件中

      多个同名变量存在时,本着一个原则:在程序运行过程中,在运行栈栈顶的内容(比如一个函数)中定义的变量,会隐藏其他与其同名的但不在同一栈帧的变量,变量的作用域便不难理解。(附注:相同的变量名称不是一个好的方法,只会增加理解的难度,所以不推荐刻意(为了隐藏变量)使用。)

       举例如下:

  1: #include <stdio.h>
  2: 
  3: int a;
  4: int b;
  5: 
  6: void abc(void){
  7: 	printf("%d\n",a);	//此处引用全局变量a
  8: 
  9: 	a =8;
 10: 	printf("%d\n",a);	//对全局变量a进行修改并输出
 11: 
 12: 	int a;		//此处覆盖了全局变量a的定义,在此之后对a的引用全都是引用此处声明的变量
 13: 	a =10;
 14: 	printf("%d\n",a);
 15: }	//退出函数后本地定义的a随之销毁,在此之后,对a的引用为对全局变量的引用
 16: 
 17: int main(){
 18: 	a=9;	//修改全局变量a
 19: 	abc();
 20: 	printf("%d\n",a);	//此处为对全局变量的引用,在abc函数中声明a后对a所做的更改并未影响全局变量
 21: 	return 0;
 22: }	
 23: 
 24: //输出结果为:
 25: //9
 26: //8
 27: //10
 28: //8
 29: 
    • 多文件中全局变量重名

      很多时候程序编译可以通过,但是在链接时遇到xxx符号解析错误,实在令人头疼,理解链接器解析符号的过程,有助于改正现有的错误。

      解析多重定义的全局符号时,遵循以下三条原则:

  1. 不允许有多个强符号
  2. 如果有一个强符号和多个弱符号,选择强符号的定义
  3. 如果有多个弱符号,从这些弱符号中任意选择一个。

      下面解释一下强弱符号。

强符号为函数和已初始化的全局变量。

弱符号为未初始化的全局变量

  •        变量的链接属性和static用法

    变量的链接属性分为三种none,internal(可以被内部引用),external(可以被外部引用).

    对于每一个none链接属性的变量,每次声明对应一个单独的实体,多次声明会有多个实体出现。

    对于链接属性为internal的变量,在同一个源文件中定义同属一个实体,在不同原文件中,分别属于不同的实体。

    对于链接属性为external的变量,在不同源文件中定义同属于一个实体,在此处声明的变量可能在其他的文件中定义。

    而static关键字修饰默认的链接属性为external的变量时,可以将该变量的链接属性改为internal,这样,可以防止在本文件中定义的变量在其他文件中的调用,减少错误使用变量的情况。

posted @ 2012-01-21 16:58  martin@dlut  阅读(637)  评论(0编辑  收藏  举报