探秘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/

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

C /C++标准库 - <cstddef> (stddef.h)

1. 概述stddef.h定义了一些标准宏以及类型,是C语言标准所必须的一部分。2. 定义2.1 Types 序号 标记 原型 说明 1 ptrdiff_t 两个指针相...
  • u010177286
  • u010177286
  • 2015年12月18日 12:14
  • 1494

stddef.h头文件学习

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

Ubuntu上pro*c预编译时找不到stddef.h

今天在ubuntu 11.04上用proc预编译一个pc文件的时候刷刷地出了几屏错误信息,最前面的部分如下: Pro*C/C++: Release 11.2.0.1.0 - Producti...
  • mosaic
  • mosaic
  • 2012年03月15日 20:04
  • 6838

C1083: Cannot open include file: ‘stddef.h’: No such file or directory

安装qt creator后,编译出现问题。 原因是没有安装vs2008,但是选择了vc2008编译。改用mingw编译就可以了。 http://qt-project.org/forums/viewth...
  • wjb801
  • wjb801
  • 2013年12月31日 12:28
  • 2165

强烈推荐《全景探秘游戏设计艺术》

http://baike.baidu.com/view/3962153.htm 这是这个公司的老大强烈推荐给我的,主策同学也强烈推荐,于是就买了一本,一开始没当回事,看了第一章就忍不住要看第二章...
  • noslopforever
  • noslopforever
  • 2012年04月30日 23:52
  • 3845

stddef.h与cstddef

#include C标准库的头文件,定义了一些标准宏及类型。 宏: typedef NULL null; 类型: typedef size_t unsigned int; --用来表示sizeof操...
  • Genius_LG
  • Genius_LG
  • 2014年01月03日 10:51
  • 3947

《.NET探秘:MSIL权威指南》读书笔记

第1章 简单示例 (第2页至第20页)   第3页,倒数第4自然段IL代码由CLR“托管”。CLR托管至少包括三个主要的活动:类型控制、结构化异常处理和垃圾收集。类型控制涉及在执行期间项类...
  • u013948190
  • u013948190
  • 2015年07月31日 06:22
  • 521

《炼数成金-Linux内核探秘》笔记1

今天看了个大神的视频,叫做Linux内核探秘,觉得好厉害,就写个笔记当博客,纪念一下。大神告诉我们Linux内核很复杂,像一座很高很高很高的山峰还很陡峭,想爬上去就不要放弃。当我看到这里的时候就想放弃...
  • niqxy
  • niqxy
  • 2018年01月29日 21:47
  • 10

Pro-C/C++编译找不到 stddef.h 文件的解决办法

以编译一个 sample 为例,出现找不到 “stddef.h” 文件的错误,如下: $ proc sample.pc Pro*C/C++: Release 11.2.0.1.0 - Pr...
  • iw1210
  • iw1210
  • 2012年12月25日 12:41
  • 8423

《C标准库》——之<stddef.h>

标准库
  • JY_95
  • JY_95
  • 2015年05月10日 08:33
  • 763
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:探秘C stddef.h
举报原因:
原因补充:

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