06: 得到一个结构体中field所占用的字节数 #define FSIZ(type,field) sizeof(((type *)0)->field) 07: 按照LSB格式把两个字节转化为一个Word #define FLIPW(ray) ((((word)(ray)[0]) * 256) + (ray)[1])//乘以256相当与左移8位 08: 按照LSB格式把一个Word转化为两个字节 #define FLOPW(ray,val) (ray)[0] = ((val)/256); (ray)[1] = ((val) & 0xFF)//除以256相当于右移8位 在C语言中,宏定义是一种预处理器特性,用于在编译期间进行文本替换,它可以增强代码的可读性和效率。以下是一些常见的宏定义及其详细解释: 1. `MEM_B(x)` 和 `MEM_W(x)`:这两个宏用于访问内存中的单个字节或字。`MEM_B(x)` 获取地址`x`处的字节,`MEM_W(x)` 获取地址`x`处的字(通常为16位)。 2. `MAX(x,y)` 和 `MIN(x,y)`:这两个宏用来找出两个参数`x`和`y`之间的最大值和最小值。它们通过条件运算符实现,如果`x`大于`y`,则返回`x`;否则返回`y`。 3. `FPOS(type, field)`:这个宏计算结构体`type`中字段`field`的偏移量。它使用指针解引用并取地址来确定偏移量。 4. `FSIZ(type, field)`:这个宏返回结构体`type`中字段`field`占用的字节数。它使用`sizeof`运算符来获取大小。 5. `FLIPW(ray)`:此宏将两个字节按照LSB(Least Significant Bit,最低有效位)格式转换成一个Word。它将第一个字节乘以256(相当于左移8位)然后加上第二个字节。 6. `FLOPW(ray, val)`:这个宏将一个Word按照LSB格式拆分为两个字节。它将Word除以256(相当于右移8位),并将商和余数分别赋值给两个字节。 7. `B_PTR(var)` 和 `W_PTR(var)`:这两个宏返回变量`var`的地址,但将其类型转换为`byte`或`word`指针,用于按字节或字访问内存。 8. `WORD_LO(xxx)` 和 `WORD_HI(xxx)`:这两个宏分别获取一个字的低位字节和高位字节。`WORD_LO`使用位与操作获取最低8位,`WORD_HI`使用右移操作获取高8位。 9. `RND8(x)`:这个宏返回一个比`x`大的最接近的8的倍数。它通过加7、除8并乘8来实现。 10. `UPCASE(c)`:此宏将小写字母转换为大写字母。如果字符在'a'到'z'的范围内,它会减去32('a'到'A'的差值)。 11. `DECCHK(c)` 和 `HEXCHK(c)`:这两个宏分别检查字符是否为十进制数字和十六进制数字。`DECCHK`检查字符是否在'0'到'9'之间,`HEXCHK`检查字符是否在'0'到'9','A'到'F'或'a'到'f'之间。 12. `INC_SAT(val)`:这个宏防止整数溢出。如果`val+1`大于`val`,则返回`val+1`,否则返回`val`。 13. `ARR_SIZE(a)`:这个宏计算数组`a`的元素个数。它通过除以数组元素的大小来得到元素数量。 14. `MOD_BY_POWER_OF_TWO(val, mod_by)`:这个宏计算`val`对2的幂次方`mod_by`的模。它使用位与操作实现。 15. `inp(port)`, `inpw(port)`, `inpdw(port)`, `outp(port, val)`, `outpw(port, val)`, `outpdw(port, val)`:这些宏用于IO操作,例如从指定端口读取或向指定端口写入字节、字或双字。 16. 预定义宏:`__LINE__`, `__FILE__`, `__DATE__`, `__TIME__` 和 `__STDC__` 是预定义宏,提供了关于源代码的位置和编译环境的信息。`__LINE__`是当前行号,`__FILE__`是包含该宏的源文件名,`__DATE__`是编译日期,`__TIME__`是编译时间,`__STDC__`表示是否遵循ANSI C标准。 了解并熟练运用这些宏定义可以提高C程序的灵活性、可维护性和效率,是C编程中不可或缺的一部分。
- 粉丝: 10
- 资源: 16
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助