文档章节

C语言存储类修饰符和类型限定符

r
 ryanliue
发布于 05/23 22:13
字数 1586
阅读 4
收藏 0

存储类修饰符

声明中出现的存储类修饰符(storage class specifier)用于修改标识符的链接和对应对象的存储周期(链接与存储周期的概念将会在本章后面介绍)。链接(linkage)和存储周期(storage duration)是C语言中常会遇到的困扰。链接(标识符的属性)和存储周期(对象的属性)两者在声明中都会受相同关键字集(存储类修饰符)的影响。本章后面会介绍对象的存储周期可以是动态的、静态的,或已分配的(allocated),而标识符的链接可以是外部(external)、内部(internal)或不作限定的。类似“静态链接”或“外部存储”等说法在C语言中是没有意义的。注意:对象有存储周期,而非链接;标识符有链接,而非存储周期。
一个声明中不能出现多个存储类修饰符。函数标识符只可以使用存储类修饰符extern或static。函数参数只可以使用存储类修饰符register。5种存储类修饰符的含义如下:
auto
声明中有修饰符auto的对象,具有动态存储周期。这种修饰符只能用于函数内的对象声明。在ANSI C中,默认情况下函数内的对象声明都有动态的存储周期,所以不需要使用修饰符auto。
register
当声明对象有动态存储周期时,可以使用修饰符register。该关键字告诉编译器,所声明对象的访问应该尽量快——理想情况下,应该将该对象存储在CPU寄存器(register)中。然而,编译器可能并不会按照理想情况那样做,而是会把用register声明的对象当成普通的动态存储周期对象。不管怎样,只要采用修饰符re-gister声明了对象,就不能用地址运算符对该对象进行操作。
static
被声明为static的函数标识符具有内部链接,换句话说,别的翻译单元无法使用所声明的函数标识符来访问该函数。
被声明为static的对象标识符可能为外部链接,也可能为内部链接,至于是哪一种链接形式,取决于对象的定义是在函数内还是函数外。被声明为static的对象具有静态存储周期。因此,修饰符static允许定义局部对象(也就是具有语句块作用域的对象)为具有静态的存储周期。
extern
被声明为extern的函数和对象标识符具有外部链接。可以在程序中任何地方使用这些标识符。外部对象具有静态的存储周期。
_Thread_local
修饰符_Thread_local声明对象为线程局部(thread-local),表示每个线程都分别具有该对象的实例。只有对象能被声明为线程局部,而函数不能。如果在函数内部声明一个线程局部对象,声明必须具有修饰符extern或static。在一个表达式中,线程局部对象的标识符引用当前线程中对象的本地实例,当前线程指当前计算该表达式的线程。示例请参见14.4.1节。

类型限定符

可以利用类型限定符修改声明中的类型,类型限定符有const、volatile、restrict和_Atomic。声明中可使用多个类型限定符,它们的顺序没有限制。类型限定符列表内可以多次出现相同的类型限定符,或者通过限定typedef名称的方式,反复使用同一个限定符。编译器会忽略重复出现的限定符,将它们视为只出现一次。
各种类型限定符的含义如下:
const
对象的类型如果采用了限定符const,则该对象就是常量。在定义该对象之后,程序无法修改它。
volatile
对象的类型如果采用了限定符volatile,则该对象可以被其他进程或事件修改。关键字volatile告诉编译器在每次使用该对象值时,都要重新读取它,即便程序本身自上一次获取后再没有修改过它的值。这种限定符通常用于硬件接口编程,以防止变量值被外部事件修改后,未能及时更新。
restrict
限定符restrict只适用于对象指针类型。这种类型限定符是C99新增加的,用来告诉编译器,一个被指针所引用的对象,如果它可以被修改,那么只能被restrict限定的指针修改,不能被除该指针以外的其他任何方式修改,无论是直接方式还是间接方式。该特性允许编译器采用特定优化技术,而该技术可能需要restrict特性的支撑。编译器也有可能会忽略限定符restrict,而不对程序结果造成任何影响。
_Atomic
采用类型限定符_Atomic声明的对象是一个原子对象(atomic object)。数组不能是原子对象。对原子对象的支持是可选的:C11实现版本中,如果定义了宏_STDC_NO_ATOMICS_,则表示程序不能声明原子对象。关于原子对象的详细介绍,请参见第14章。
编译器也可以将const对象存储在内存中的只读区域,但是volatile对象不能。如果程序不使用volatile对象的地址,也有可能编译器干脆不为该对象分配内存。
对象如果同时使用了限定符const和volatile,如下例中ticks对象所示,它不能被程序本身修改,但可以被其他事件修改,例如时钟芯片的中断处理程序:
extern const volatile int ticks;

© 著作权归作者所有

r
粉丝 0
博文 18
码字总数 42817
作品 0
黄冈
私信 提问
C语言基础-01-基本数据类型

C语言的数据类型大致可以分为下图中的几类: 一、变量 跟其他语言一样,C语言中用变量来存储计算过程使用的值,任何变量都必须先定义类型再使用。为什么一定要先定义呢?因为变量的类型决定了...

Corwien
2016/03/15
34
0
六、基本数据类型

说明:这个C语言专题,是学习iOS开发的前奏。也为了让有面向对象语言开发经验的程序员,能够快速上手C语言。如果你还没有编程经验,或者对C语言、iOS开发不感兴趣,请忽略 C语言有丰富的数据...

长平狐
2013/03/28
75
0
GLSL学习笔记

限定符: attribute表示修饰顶点属性的变量,这种类型的变量只能出现在vertex shader中,且为只读性性。 uniform表示修饰图元,帧的变量,这种类型的变量无论在vertex shader还是fragment sh...

长平狐
2012/08/13
68
0
Java虚拟机,类文件结构深度解析

Java类文件结构 Java虚拟机不和包括Java在内的任何语言绑定,只与 "Class文件" 这种特定的二进制文件所关联, Class文件中包含了Java虚拟机指令集合符号表以及若干其它辅助信息。 Java虚拟机...

李红欧巴
05/14
0
0
Objective-C高级编程笔记一(自动引用计数)

示例代码下载 手动引用计数 MRC内存管理的思考方式 自己生成的对象自己持有 不是自己生成的对象,自己也能持有 不在需要自己持有的对象时释放 不是自己持有的对象无法释放 对象操作与Objecti...

酒茶白开水
04/04
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Flutter移动端实战手册

该文章属于<简书 — 刘小壮>原创,转载请注明: <简书 — 刘小壮> https://www.jianshu.com/p/d27c1f5ee3ff iOS接入Flutter 在进行iOS和Flutter的混编时,iOS比Android的接入方式略复杂,但也...

刘小壮
2分钟前
0
0
测试环境项目一键部署

git项目测试环境一键部署脚本 #!/bash/sh pid=`ps -ef | grep 'user_demo.jar' | grep -v grep | awk '{print $2}'` kill -9 $pid #跳转到git clone下目录 cd /home/apple/userdemo/ #拉取最......

ccman996
5分钟前
0
0
应用框架(spring-boot参数配置与使用)

这很耳东先生
12分钟前
0
0
使用SecureCRT从windows上传文件到Linux

点击File,然后选择SFTP,打开SFTP,然后进行下列操作。 1.指定文件所在路径 lcd E:\ 2.查看当前windows文件所在路径 lpwd 3.指定linux下文件上传路径 cd /usr/local 4.查询当前linux文件上传...

大雁南飞了
14分钟前
1
0
前后端分离-前端搭建(Vue)(3)加入Element和axios

继续上篇博客的Vue刚刚搭建完 , https://my.oschina.net/u/4116654/blog/3064431 这次我们来把Element 和axios弄好 首先先安装Element 下载好了之后 在src目录下的main.js里去添加Element的...

咸鱼-李y
25分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部