网站开发运营产品经理招聘,wordpress定制首页,深圳向失业人员发放补贴,上海做网站的公司官网一、 链接属性C语言中链接属性决定如何处理在不同文件中出现的标示符。标示符的作用域与它的链接属性有关#xff0c;但这两个属性并不相同。链接属性有3种#xff1a; external(外部)#xff0c;internal(内部) 和 none(无)。1. none: 没有链接的标示符#xff0c;总是被当…一、 链接属性C语言中链接属性决定如何处理在不同文件中出现的标示符。标示符的作用域与它的链接属性有关但这两个属性并不相同。链接属性有3种 external(外部)internal(内部) 和 none(无)。1. none: 没有链接的标示符总是被当做单独的个体也就是说改标示符的多个声明被当做不同的实体。2. internal: 在同一个源文件内的所有声明中都指同一个实体但位于不同源文件的多个声明则分属不同的实体。3. external: 标示符不论声明多少次位于几个文件都表示同一个实体。举一个简单的例子对链接属性进行说明如下图1. 在缺省情况下标示符b,c,f 的链接属性为external 其余标示符的链接属性则为none。因此另一个源文件也包含了标示符b的类似声明并调用函数c他们实际上访问的是这个源文件所定义的实体。f的链接属性之所以是external是因为它是函数名。这个源文件中调用f实际上将链接到其他源文件所定义的函数甚至这个函数的定义可能出现在某个函数库。2. 关键字extern和static用于在声明中修改标示符的连接属性。如果某个声明在正常情况下具有external链接属性在它前面加上static关键字可以使它的链接属性变为internal。例如将b声明为static int b;那么变量b就将为这个源文件所私有。在其他源文件中如果也链接到一个叫做b的变量那么它所引用的是另一个不同的变量。3. static只对缺省链接属性为external的声明才有改变链接属性的效果。例如你尽管可以在变量e前面加上static关键字但它的效果完全不一样因为e的缺省链接属性不是external。二、 存储类型变量的存储类型是指存储变量值的内存类型。有三个地方可以用于存储变量普通内存、运行时堆栈、硬件寄存器。变量的缺省存储类型取决于它的声明位置。1. 凡是在任何代码块之外声明的变量总是存储于静态内存中也就是不属于堆栈的内存这类变量称为静态(static)变量。静态变量在程序运行之前创建更确切的说是在将可执行文件加载到内存的时候创建其在程序的整个执行期间始终存在。2. 在代码块内部声明的变量的缺省存储类型是自动的(automatic), 也就是说它存储于堆栈中称为自动变量。有一个关键字auto就是用于修饰这种存储类型的但它极少使用因为代码块中的变量缺省情况下就是自动变量。在程序执行到声明自动变量的代码块时自动变量才被创建当程序的执行流离开代码块时这些自动变量便自行销毁。在代码块内部声明的变量如果给它加上static可以使它的存储类型从自动变为静态。注意修改变量的存储类型并不表示修改改变量的作用域。它任然只能在该代码块内部按名字访问。函数的形式参数不能声明为静态因为实参总是在堆栈中传递给函数。3. 关键字register可以用于自动变量的声明提示它们应该存储于机器的硬件寄存器而不是内存中。三、 static关键字使用说明注意到在“连接属性”和“存储类型”中都有可能使用到static关键字因为我们有必要搞清楚在不同情况下static关键字的作用。1. 当它作用于函数定义时或者用于代码块之外的变量声明时static关键字用于修改标示符的链接属性。从external改为internal但标示符的存储类型和作用域不受影响。用这种方式声明的函数或变量只能在声明它们的源文件中访问。2. 当它作用于代码块内部的变量声明时static用于修改变量的存储类型。从自动变量修改为静态变量但变量的链接属性和作用域不受影响。用这种方式声明的变量在程序执行之前创建并在程序的整个执行期间一直存在。四、 作用域、存储类型示例我们就以下面的示例代码进行说明。1. 第1行a的链接属性为external第二行extern在技术上并非必要第三行的static关键字修改了c的缺省链接属性把它改为internal。声明了变量a和b(具有external链接属性)的其他源文件在使用这两个变量时实际所访问的是声明与此处的这两个变量。但变量c只能由这个源文件访问因为它具有internal链接属性。2. 变量a,b,c 的存储类型为静态表示它们并不存储于堆栈中。因此这些变量在程序执行之前创建并一直保持它们的值直到程序结束。3. 第4行声明了两个标示符d的作用域从第四行直到文件结束。对于函数而言存储类型不是问题因为代码总是存储在静态内存中的。参数e不具有链接属性所以我们只能从函数内部通过名字访问它。4. 第6~8行声明局部变量所以它们的作用域到函数结束为止它们不具有链接属性所以它们不能在函数的外部通过名字访问。变量g的存储类型是静态所以它在程序的整个执行过程中一直存在。当程序开始执行时它被初始化为20。当函数每次被调用时它并不会被重新初始化。5. 第9行的声明并不需要这个代码位于第1行声明的作用域之内。6. 第1213行代码块声明为局部变量。它们都具有自动存储类型不具有链接属性。7. 第14行使全局变量h在这个代码块内可以被访问。它具有external链接属性存储于静态内存中。8. 第1920行用于创建局部变量。9. 第25行声明了函数i它具有静态链接属性。五、 作用域、链接属性和存储类型总结六、 变量存储区域分配图大家可以根据上述示例代码将变量一一对应的放到指定的区域。