探秘C stddef.h

原创 2015年11月21日 20:39:55

stddef.h

这个头文件里变包含的就是C 的标准定义。C标准委员会认为即使再一个独立的环境中,C语言也应当有它的用途,独立环境是一个由于种种原因而不能支持完整C标准库的环境。对于这样的实现只需要实现4个C语言的头文件就可以了,分别是:<float.h>   <limits.h>   <stdarg.h>  <stddef.h>.它也可以支持更多,但是C 标准没有对中间级别进行说明。

在一些环境中,实现必须提供整个的C标准库,这种环境就叫宿主环境,它是指代完全实现C标准的环境的正式术语。

<float.h>   描述了浮点数标示的属性

<limits.h>   描述了整数标示的属性

<stdarg.h>  提供了遍历可变参数表时需要的宏

<stddef.h> 独立环境程序使用的所有其他类型或者宏定义都只能由一个头文件提供

<stddef.h> 的内容

类型:

ptrdiff_t    两个指针相减的结果是有符号整数类型

size_t       是sizeof 的结果类型,无符号整数类型

wchar_t    一个整值类型,它的范围内的值可以表示为最大扩展字符集中所有成员的不同编码值,而该字符集是由支持它的区域设置指定的。

宏:

NULL   这个宏后边说,其实它到底是0 ,0L,  void * 0 是根据不同情况来定的

offsetof   (type, member-designator)  :

展开为一个size_t 类型的整值常量表达式,它的值是从结构体的起始位置(由type 指定)到结构体成员(由member-designator 指定)的偏移量,以字节为单位。member-designator 应该满足:

static type t :然后表达式&(t, member-designator)就会计算一个地址常量。

在linux 下他是这样做的:

#define offsetof(TYPE, MEMBER)   ((size_t )  & ((TYPE *) 0)->MEMBER)

没什么,就是计算偏移量。

<stddef.h>的使用

ptrdiff_t     再一个C表达式中对两个指针相减结果类型就是ptrdiff_t  的。它是一个可以表示负值的整数类型。只有当两个指针具有可兼容的数据对象类型时,才能对它们进行相减。注意编译器会检查类型,像const 限制符都会检查。这个类型其实就是long int

计算方法:

1.把两个指针都表示对公共地址空间的某一个节点的偏移量

2.将这两个偏移量相减,得到一个有符号的中间结果

3.让中间结果除以这两个指针指向的元素对象大小(以字节为单位)

size_t     在一个C表达式中,sizeof 运算符的结果类型就是 size_t .一个无符号整形,但是现在linux 环境下已经将这个大小提升到了无符号长整形大小。

这个类型相比上一个类型要安全的多,用它来做数组下标你永远不需要担心安全的问题。

wchar_t  一个宽字节字符的字符串常量。它可以表示实现支持的所有宽字节字符编码的所有编码值。对于一个只对宽字节字符提供最小支持的实现来说,它可能和char 一样小,也可能和unsigned long 一样大。

NULL    这个宏可能定义为0,0L, (void *)(0) .

注意最后一种定义方式可以和任意的指针类型兼容,但是不能与函数指针兼容。

 

 

查看原文:http://zmrlinux.com/2015/11/21/%e6%8e%a2%e7%a7%98c-stddef-h/

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

Linux下C库学习 - stddef.h

stddef.h定义了一些标准宏和变量, 标准宏有NULL 这个定义大家应该都比较熟悉了,是这样子的((void *)0) offsetof() 这个宏的定义是这样子的offsetof(TYPE...
  • mill_li
  • mill_li
  • 2017年03月22日 20:26
  • 177

C标准库参考指南系列译文(11)stddef.h

英文原文:http://www.acm.uiuc.edu/webmonkeys/book/c_guide/2.11.html 原文作者:Eric Huss 中文译者:柳惊鸿 Poechant 版...

stddef.h stm32

  • 2014年05月07日 16:00
  • 2KB
  • 下载

stdafx.h头文件探秘

  • 2011年02月24日 00:58
  • 10KB
  • 下载

stddef.h

头文件stddef.h(standard define标准定义)。独立环境——由于种种原因而不能支持完整的C标准库的环境。独立环境程序使用的所有其他类型或者宏定义(除了float.h、limits.h...

stddef.h头文件学习

stddef.h头文件看意思就是标准定义,定义有一些变量和宏。其中定义了NULL和offsetof()宏,NULL指向0或者是无效指针,offsetof获取一个元素在结构中的偏移量。下面看看具体的代码...

H264的CAVLC探秘

CAVLC的算法搜索出来的资料比较多,但是怎么理解这个CAVLC呢。 CAVLC=CA+VLC VLC(Variable-Length Code) 变长编码 想想霍夫曼编码吧。还不明白,g...
  • ljb_iss
  • ljb_iss
  • 2013年11月13日 16:56
  • 1082

locale.h和stddef.h

1、locale.h 1-1、函数简介 char *setlocale(int category, const char *locale)//设置地域化信息 category是一个常量,指定...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:探秘C stddef.h
举报原因:
原因补充:

(最多只允许输入30个字)