C变量作用域,生存期,链接特性

变量的作用域

C语言中变量的作用域(Scope)有以下几种:

  • 块作用域(block scope)
  • 函数作用域(function scope)
  • 函数原型作用域(function prototype scope)
  • 文件作用域(file scope)

块作用域

定义在{}内的变量以及函数内部(同样包含‘{}’)的变量通常为块作用域,变量的可见性(visible)从定义处开始,直到块结尾。

函数参数内的变量,虽然在函数‘{’前,也处于块作用域内。

函数作用域

函数作用域仅适用于与goto语句一起使用的标签。这意味着即使标签首次出现在函数的内部块中,其范围也会扩展到整个函数。 如果在两个单独的块中使用相同的标签,那将会令人困惑,标签的功能范围可以防止这种情况发生。

函数原型作用域

一般出现在函数的声明处,函数参数的变量作用域仅在变量定义处开始,函数声明处结尾。意味着编译器仅仅关系函数声明的参数数据类型,而参数名,通常不关心。

文件作用域

在任何函数外定义的变量拥有文件作用域,文件作用域的变量其可见性从定义处开始,直到文件结尾。

Note: 一般说变量具有文件作用域时,其可见性一般整个转换单元(translation unit)(在C和C ++编程语言术语中,转换单元是生成目标文件的C或C ++编译器的最终输入。 在临时使用中,它有时被称为编译单元。 翻译单元大致由C预处理器处理后的源文件组成,这意味着#include指令中列出的头文件是字面上包含的,#ifdef中的代码段可能包含在内,并且宏已经扩展。)。

链接特性

C语言中的变量有以下三种链接特性:

  • 外部链接(external linkage)
  • 内部链接(internal linkage)
  • 无链接(no linkage)

处于块作用域,函数作用域,函数原型作用域的变量“无链接”,意味着这些变量在它们所在的定义处私有。

处于文件作用域的变量为外链接或内链接。一个为外链接的变量能够在多文件程序中的任意地方使用;一个为内链接的变量只能在当个转换单元(translation unit)内的任意地方使用。

Note:在任何函数外定义的变量,如果用标识符"static"标识,则为文件作用域,且为内部链接。默认为文件作用域,外部链接。

int giants = 5;               // file scope, external linkage
static int dodgers = 3    // file scope, internal linkage
int main()
{
    ...
}

变量存储周期

作用域(scope)和链接(linkage)描述了标识符的可见性。 存储周期(storage duration)描述了这些标识符访问的对象的持久性。C语言的对象有以下四种存储周期:

  • 静态存储期(static storage duration)
  • 线程存储期(thread storage duration)
  • 自动存储期(automatic storage duration)
  • 分配存储期(allocated storage duration)

若对象拥有静态存储期,则其存在于程序的整个运行周期。拥有文件作用域的变量拥有静态存储期。

线程存储期一般用于并发编程(concurrent programming),程序的执行被划分为多个线程执行。拥有线程存储期的对象存在其声明处,直到线程终止处。一般使用关键字"_Thread_local"。若一般变量使用该标识符,则每个线程都会复制该变量为每个线程私有。

在块作用域中声明的变量一般拥有自动存储期,当程序进入定义该变量所在的块时,这些变量具有为其分配的内存,并且当块退出时释放内存。

总结

Storage Class Duration Scope Linkage How Declared
automatic Automatic Block None In a block
register Automatic Block None In a block with the keyword register
static with external linkage Static File external Outside of all functions
statice with internal linkage Static File Internal Outside of all functions with the keyword static
static with no linkage Static Block None In a block with the keyword static

原文地址:https://www.cnblogs.com/jeffrey-yang/p/10261537.html

时间: 2024-10-09 18:41:18

C变量作用域,生存期,链接特性的相关文章

变量类型(接C变量作用域,生存期,链接特性)

自动变量 自动存储类型,特点:自动存储期,块作用域,无链接.默认情况下,在块级作用域中或函数头中的变量属于自动存储类型的变量.当然,也可以受用关键字"auto"特别声明,一般用处不大. 示例: // hiding.c -- variables in blocks #include<stdio.h> int main() { int x = 30; // original x printf("x in outer block: %d at %p\n", x

【转】作用域、链接属性、存储类型总结--转载学习,很清晰,很详细

标识符: 首先,在讨论这三种东西之前,详细说明一下C语言中的标识符. 标识符是用户编程为变量.常量.函数.语句等指定的名字,就好比人名一样的东西. 标识符的命名规则如下: 1.只能由字母.数字.下划线组成,并且首字符不能是数字: 2.不能把C语言的关键字作为标识符: 3.对大小写敏感: 其次,需要明确,作用域和链接属性是在标识符范畴内讨论的,存储类型是在标识符中的变量范畴内讨论的. 作用域: 标识符的作用域就是程序中该标识符可以被使用的区域,由它的声明位置决定. 分为以下四类: 1.文件作用域

HTML代码中在两个匿名函数中使用同名变量出现bug而引起的变量作用域的思考

在学习HTML的时候,为了方便地对同一个css样式的不同值的效果进行对比,我做成了下面这个样子. 代码也是很典型的用于展示的格式(p元素的内容随便写的): 1 <head> 2 <style> 3 p{ 4 border: medium solid black; 5 padding: 5px; 6 margin: 5px; 7 text-justify:inter-word; 8 } 9 button{ 10 margin: 5px; 11 } 12 </style>

js的变量,变量作用域,作用域链

变量声明: 使用var关键字声明,如果使用没有声明的变量,则JS会自动声明此变量根据变量作用域.如果变量只声明为赋值,则此时值是undefined.重复声明变量,在JS不会报错,会依据最后一次的声明来处理变量. 变量作用域: 一个变量的作用域是,程序代码定义这个变量的区域,全局变量在程序代码内任何地方都可以访问. 包括在{}函数,对象内的变量(属性)成为局部变量. 在函数体内定义的变量成为局部变量,作用域也是局部,函数参数也是局部变量. 他们只在函数体内有意义. 在函数体内,局部变量优先于全局变

Sass学习笔记 -- 变量及变量作用域历史遗留问题

sass有两种后缀名文件: 一种后缀名为sass,写选择器时不能使用大括号和分号 一种后缀名为scss,使用大括号和分号 //后缀名为sass的语法,不能出现大括号和分号 $highlight-color: #abcdef .selected   border: 1px $highlight-color solid    //后缀名为scss的语法,跟css一样,需要大括号和分号 $highlight-color: #abcdef; .selected{   border:1px solid $

Java基础知识笔记(七:接口、变量作用域和参数传递)

一.接口 Java语言不允许一个子类拥有多个直接父类,即任何子类只能有一个直接父类.但允许一个类实现多个接口,即在定义类的接口名称列表中可以包含1个或多个接口名称,从而实现多重继承的特性.接口的定义格式如下: [接口修饰词列表] interface 接口名 [extends 接口名称列表] { 接口体 } 接口修饰词列表可以包含0个.1个或者多个接口修饰词.如果存在多个接口修饰词,则在相邻两个接口修饰词之间采用空格分隔开.接口修饰词包括:public.abstract和strictfp等.在同一

变量作用域&amp;函数作用域

一. 变量作用域 1)全局变量 在全局环境下声明的变量被视为全局变量. 在没有使用var进行声明的时候,变量就被定义为全局变量.在ES5的严格模式下,如果变量没有使用var来声明是会报错的. 2)局部变量 在函数体内部声明的变量被视为局部变量.其中涉及到js中的函数作用域问题. 二. 函数作用域 因为js中是没有块级作用域的概念,所谓的块级作用域就是指花括号内的的每一段代码都有其自己的作用域,但js中并不是,例如for循环中定义的变量,外界也可以访问:但是js中有函数作用域的概念,即在每一个函数

[Objective-c 基础 - 2.5] .h和.m文件,点语法,成员变量作用域

A. 命令行编译和XCode编译 1.在存在多个.m源码实现文件的情况下,若根据需要引入.m文件,使用命令行仅仅编译主.m文件即可,但是XCode会同时编译全部.m文件,会发生编译错误(重复定义全局变量或函数) 解决方案: 使用.h和.m文件,分开声明和定义 B.XCode功能 1.自动生成.h和.m 2.保存.引用快捷代码块 3.方法索引注释 #pragma mark 方法的说明 #pragma mark - 方法的说明 加入分组线 4.链接错误查看,使用左上角的感叹号logo C.点语法 实

perl学习之六:变量作用域

变量作用域 (一)包变量 $x = 1 这里,$x是个包变量.关于包变量,有2件重要的事情要了解: 1)假如没有其他申明,变量就是包变量:2)包变量总是全局的. 全局意味着包变量在每个程序里总可访问到.在你定义了$x=1后,程序的任何其他部分,甚至在其他文件里定义的子程序,都能影响和修改$x的值.这点毫无例外:包变量总是全局的. 包变量被归类到族(叫做packages).每个包变量的名字包括2部分.这2部分类似于变量自己的名字和族名.假如喜欢,你可以称呼美国副总统为'AL',但对其全名'Al G