C

编辑 / C/C++ / 发布于2020-08-03 / 更新于2023-03-16 / 阅读 239

测试环境:Visual Studio Community 2019

作用域

有四种不同类型的作用域----文件作用域,函数作用域,代码块作用域和原型作用域。

  • 代码块作用域:位于一对花括号之间的所有语句称为一个代码块,代码块开始声明的具有~。
  • 文件作用域:任何在所有代码块之外声明的标识符都有~。
  • 原型作用域:只适用于在函数原型中声明的参数名。
  • 函数作用域:只适用于语句标签,语句标签用于goto语句。

链接属性

链接属性一共有三种:external,internal和none。

  • external:无论声明多少次,几个源文件中的声明都表示同一实体;

  • internal:只有同一文件内才为同一实体;

  • none:多个声明被当作独立不同的实体;

  • 在缺省情况下,文件作用域内(不存在于任意函数内)的变量或函数为external。如果在它前面加上static可以使它的链接属性变为internal,例如:

      static int a;
    

那么变量a就是这个源文件所私有。

  • static 只对缺省链接属性为external的声明才有改变链接属性的效果。

  • extern关键字,只能用于声明变量,不能用于定义(除非声明时有初始化,才被当作定义)。当缺省时既可以为声明,也可以是定义。

      int a;
      extern int b;
      extern int c=10;
    

a:即是声明又是定义,b:只是声明,c:定义。

存储类型

有三个地方可用于存储变量:普通内存,运行时堆栈,硬件寄存器。

  • 所有代码块之外声明的变量总是存储在静态内存中,这类变量称为静态变量,静态变量在程序运行之前创建,整个执行过程中都存在。静态变量会被初始化为0。
  • 代码块内部声明的变量的存储类型是自动的,也就是说它存储在堆栈中。自动变量在代码块执行到此块时自动变量才被创建,执行完毕后就消失。
  • regiser 提示他们应该存储于机器的硬件寄存器而不是内存中。这类变量称为寄存器变量。
    当static修饰代码块内部的变量声明时,会将自动变量修改为静态变量,但链接属性和作用域不受影响。
C