C语言宏定义使用技巧

更新时间:2023-07-31 23:55:53 阅读: 评论:0

C语言宏定义使用技巧
写好C语言,漂亮的宏定义很重要,使用宏定义可以防止出错,提高可移植性,可读性,方便性 等等;下面列举一些成熟软件中常用得宏定义;;;;;;
1,防止一个头文件被重复包含
ifndef COMDEF_H
define COMDEF_H
/
typedef unsigned long int uint32; / Unsigned 32 bit value /
typedef unsigned short uint16; / Unsigned 16 bit value /
typedef unsigned char uint8; / Unsigned 8 bit value /
typedef signed long int int32; / Signed 32 bit value /
打草惊蛇
typedef signed short int16; / Signed 16 bit value /
typedef signed char int8; / Signed 8 bit value /
/
typedef unsigned short word; / Unsinged 16 bit value type. /
typedef unsigned long dword; / Unsigned 32 bit value type. /
typedef unsigned char uint1; / Unsigned 8 bit value type. /
typedef unsigned short uint2; / Unsigned 16 bit value type. /
typedef unsigned long uint4; / Unsigned 32 bit value type. /
typedef signed char int1; / Signed 8 bit value type. /
typedef signed short int2; / Signed 16 bit value type. /
typedef long int int4; / Signed 32 bit value type. /
typedef signed long sint31; / Signed 32 bit value /
typedef signed short sint15; / Signed 16 bit value /
毛奇龄typedef signed char sint7; / Signed 8 bit value /
3,得到指定地址上的一个字节或字
define MEM_B x    byte  x 
define MEM_W x    word  x 
温柔的嫂子
4,求最大值和最小值
define MAX x, y  x > y  x : y
望字开头的成语define MIN x, y  x < y  x : y
5,得到一个field在结构体struct中的偏移量
define FPOS type, field  \
/lint -e545 /  dword & type  0-> field  /lint +e545 /
6,得到一个结构体中field所占用的字节数
define FSIZ type, field  sizeof type  0->field
7,按照LSB格式把两个字节转化为一个Word
define FLIPW ray  word ray0  256 + ray1
8,按照LSB格式把一个Word转化为两个字节
define FLOPW ray, val  \
ray0 = val / 256; \
ray1 = val & 0xFF
9,得到一个变量的地址word宽度
define B_PTR var  byte  void  &var
define W_PTR var  word  void  &var
10,得到一个字的高位和低位字节
define WORD_LO byte word & 255
define WORD_HI byte word >> 8
11,返回一个比X大的最接近的8的倍数
define RND8 x  x + 7 / 8  8
12,将一个字母转换为大写
神奇的英语
define UPCASE c  c >= 'a' && c <= 'z'  c - 0x20 : c
13,判断字符是不是10进值的数字
define DECCHK c  c >= '0' && c <= '9'
14,判断字符是不是16进值的数字
define HEXCHK c  c >= '0' && c <= '9' ||\
c >= 'A' && c <= 'F' ||\
c >= 'a' && c <= 'f'
15,防止溢出的一个方法
define INC_SAT val  val = val+1 > val  val+1 : val
16,返回数组元素的个数
define ARR_SIZE a  sizeof a  / sizeof a0 
17,返回一个无符号数n尾的值MOD_BY_POWER_OF_TWOX,n=X%2^n
define MOD_BY_POWER_OF_TWO val, mod_by  \
dwordval & dwordmod_by-1
18,对于IO空间映射在存储空间的结构,输入输出处理
define inpport volatile byte  port
define inpwport volatile word  port
define inpdwport volatile dword port
define outpport, val volatile byte  port = byte val
define outpwport, val volatile word  port = word val
define outpdwport, val volatile dword  port = dword val
2005-9-9添加
19,使用一些宏跟踪调试
A N S I标准说明了五个预定义的宏名;它们是:
_ L I N E _
_ F I L E _
_ D A T E _
百因必有果_ T I M E _
_ S T D C _
如果编译不是标准的,则可能仅支持以上宏名中的几个,或根本不支持;记住编译程序
也许还提供其它预定义的宏名;
_ L I N E _及_ F I L E _宏指令在有关 l i n e的部分中已讨论,这里讨论其余的宏名;
_ D AT E _宏指令含有形式为月/日/年的串,表示源文件被翻译到代码时的日期;
源代码翻译到目标代码的时间作为串包含在_ T I M E _中;串形式为时:分:秒;
如果实现是标准的,则宏_ S T D C _含有十进制常量1;如果它含有任何其它数,则实现是
非标准的;
可以定义宏,例如:
当定义了_DEBUG,输出数据信息和所在文件所在行
ifdef _DEBUG
define DEBUGMSGmsg,date printfmsg;printf“%d%d%d”,date,_LINE_,_FILE_
el
define DEBUGMSGmsg,date
endif
20,宏定义防止使用是错误
用小括号包含;
例如:define ADDa,b a+b
用do{}while0语句包含多语句防止错误
例如:difne DOa,b a+b;\
a++;
应用时:if….
DOa,b; .符号的使用
    宏的解释方法
我们能碰到的宏的使用
宏使用中的陷阱
         
          常见的基础性问题:
            关于和
在C语言的宏中,的功能是将其后面的宏参数进行字符串化操作Stringfication,简单说就是在对它所引用的宏变量通过替换后在其左右各加上一个双引号;比如下面代码中的宏:
define WARN_IFEXP    \
电台文案    do{ if EXP    \
          fprintfstderr, "Warning: " EXP "\n"; }    \
    while0
那么实际使用中会出现下面所示的替换过程:
WARN_IF divider == 0;
被替换为
do {
时代变迁    if divider == 0
fprintfstderr, "Warning" "divider == 0" "\n";
} while0;
这样每次divider除数为0的时候便会在标准错误流上输出一个提示信息;
而被称为连接符concatenator,用来将两个Token连接为一个Token;注意这里连接的对象是Token就行,而不一定是宏的变量;比如你要做一个菜单项命令名和函数指针组成的结构体的数组,并且希望在函数名和菜单项命令名之间有直观的、名字上的关系;那么下面的代码就非常实用:
struct command
{
char  name;
void function void;
};
define COMMANDNAME { NAME, NAME  _command }
.
}
COMMAND宏在这里充当一个代码生成器的作用,这样可以在一定程度上减少代码密度,间接地也可以减少不留心所造成的错误;我们还可以n个符号连接 n+1个Token,这个特性也是符号所不具备的;比如:
define LINK_MULTIPLEa,b,c,d a_b_c_d
typedef struct _record_type LINK_MULTIPLEname,company,position,salary;
.的使用
...在C宏中称为Variadic Macro,也就是变参宏;比如:
define myprintftemplt,... fprintfstderr,templt,__VA_ARGS__
. fprintfstderr,templt,args

本文发布于:2023-07-31 23:55:53,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/89/1103651.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:使用   防止   代码   标准   结构   定义   错误   包含
相关文章
留言与评论(共有 0 条评论)
   
验证码:
推荐文章
排行榜
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图