一、宏的定义与撤销 需要注意的是: (1)宏定义应注意添加括号,这样语义会比较清晰。 (2)使用#undef可以撤销宏定义。 (3)引号中的宏定义不会被替换。 (4)宏定义的宏名必须是合法的标识符。 (5)宏定义中单、双引号必须成对出现。 二、带有参数的宏定义 需要注意的是: (1)宏调用时参数的个数要与定义时相同。 三、跨行的宏定义,使用反斜杠 分隔 四、三个特殊符号:#,##,#@ 五、常见的宏定义 1、防止头文件被重复包含 2、得到指定地址上的一个字节值或字值 3、得到一个field在结构体(struct)中的偏移量 #define OFFSETOF( type, field ) ( (size_t) &(( type *) 0)-> field ) 4、得到一个结构体中field所占用的字节数
5、得到一个变量的地址(word宽度) #define B_PTR(var) ( (byte *) (void *) &(var) ) 6、将一个字母转换为大写
7、判断字符是不是10进制的数字 #define DECCHK(c) ((c) >= '0' && (c) <= '9') 8、判断字符是不是16进制的数字
9、防止溢出的一个方法 #define INC_SAT(val) (val = ((val)+1 > (val)) ? (val)+1 : (val)) 10、返回数组元素的个数
|
|