宏定义define的奇技淫巧

define中的三个特殊符号:#,##,#@

#define Conn(x,y) x##y
#define ToChar(x)#@x
#define ToString(x)#x

对应解释如下:

(1)x##y 表示x连接y,如下:
    int n = Conn(123,456);/* 结果就是n=123456;*/
    char* str = Conn("asdf","adf");/*结果就是 str = "asdfadf";*/
(2) #@x代表给x加上单引号,结果返回是一个const char。如下:
    char a = ToChar(1);结果就是a='1';
    做个越界试验char a = ToChar(123);结果就错了;
    但是如果你的参数超过四个字符,编译器就给给你报错了!
    error C2015: too many characters in constant :P
(3) #x 给x加双引号
    char* str = ToString(123132);就成了str="123132";
    

得到一个field在结构体(struct)中的偏移量

#define OFFSETOF( type, field ) ((size_t)&(( type *) 0)-> field )

得到一个结构体中field所占用的字节数

#define FSIZ( type, field ) sizeof(((type *) 0)->field )

将一个字母转换为大写

#define UPCASE( c )(((c)>='a'&&(c)<='z')?((c)- 0x20):(c))

判断字符是不是10进值的数字

#define DECCHK( c )((c)>='0'&&(c)<='9')

判断字符是不是16进值的数字

#define HEXCHK( c )(((c)>='0'&&(c)<='9')||((c)>='A'&&(c)<='F')||((c)>='a'&&(c)<='f'))

防止溢出的一个方法

#define INC_SAT( val )(val =((val)+1 >(val))?(val)+1 :(val))

返回数组元素的个数

#define ARR_SIZE( a )(sizeof((a))/sizeof((a[0])))

使用一些宏跟踪调试

_LINE_ /*(两个下划线),对应%d*/
_FILE_ /*对应%s*/
_DATE_ /*对应%s*/
_TIME_ /*对应%s*/