C语言笔记|2016 年4月1日星期五[键入公司名称]|位域 1 位域“位域( Bit-Band )”也叫“位段”。位域是把一个类型单元中的二进位划分为几个不同的区域,并说明每个区域的位数。每个域都有一个“域名”。允许在程序中按“域名”进行操作。在K&R 中,规定的位域类型只能是 ints ——这应该是包括 signed 和 unsigned 的 char 、 short 和 int 。而且最好注明是 signe d 还是 unsigned 类型的。定义 struct 位域名称{ 数据类型位域名:位域长度; ……} 如: struct abc { int a:8; int b:2; int c:6;} 说明?一个位域字段必须存储在其位域数据类型的所占空间中, 不能横跨两个该位域数据类型的单元。也就是说, 当某个位域字段正处于两个该位域类型的单元中间时,只使用第二个单元,第一个单元剩余的 bit 位置补( pad )0。如: struct abc { unsigned a:4; /* 第一个字节后 4位*/ unsigned :0; /* 空域*/ unsigned b:4; /* 从第二字节开始存放*/ unsigned c:4; }?位域可是无位域名,但它只能用来填充或调整位置。无名的位域不能使用的。 C语言笔记|2016 年4月1日星期五[键入公司名称]|位域 2 位域成员的引用与结构体成员的引用完全一致。如: struct abc { unsigned a:1; unsigned b:3; unsigned c:4; } bit ,* pbit ; bit .a=1; bit .b=7; bit .c= 15 ; pbit -> a=0; pbti -> b &= 3; pbti -> c |= 1; C语言笔记|2016 年4月1日星期五[键入公司名称]|位域 3 Assert() asser t 宏的原型定义在<> 中, 其作用是如果它的条件返回错误, 则终止程序执行。事实上,它是个宏,并且作用并非“报错”。原型定义: #include <> void assert ( int expression ); assert 的作用是先计算表达式 expression ,如果其值为假( 即为 0), 那么它先向 stder r 打印一条出错信息, 然后通过调用 abor t 来终止程序运行。请看下面的程序清单 : #include <> #include <> #include <> int main ( void ) { FILE * fp ; // 以可写的方式打开一个文件,如果不存在就创建一个同名文件 fp = fopen ( "" , "w" ); assert ( fp ); // 所以这里不会出错 fclose ( fp ); // 以只读的方式打开一个文件,如果不存在就打开文件失败 fp = fopen ( "" , "r" ); assert ( fp ); // 所以这里出错 fclose ( fp ); // 程序永远都执行不到这里来 return 0;}[ ******@localhost error_process ]# gcc badptr .c [ ******@localhost error_process ]# ./ a. out a. out : badptr .c: 14 : main : Assertion `fp' failed. assert() 的缺点是, 频繁的调用会极大的影响程序的性能, 增加额外的开销。在调试结束后,可以通过在包含#include <> 的语句之前插入#define NDEBUG 来禁用 assert 调用,示例代码如下: #include <> #define NDEBUG #include <> ( 1) 在函数开始处检验传入参数的合法性如: C语言笔记|2016 年4月1日星期五[键入公司名称]|位域 4 int resetBufferSize (int nNewSize ) { // 功能: 改变缓冲区大小, // 参数:nNewSize 缓冲区新长度// 返回值: 缓冲区当前长度// 说明: 保持原信息内容不变 nNewSize<=0 表示清除缓冲区 assert ( nNewSize >= 0 ); assert ( nNewSize <= MAX_BUFFER_SIZE ); ... }(2)每个 assert 只检验一个条件, 因为同时检验多个条件时, 如果断言失败,
AN C语言笔记 来自淘豆网m.daumloan.com转载请标明出处.