宏定义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*/
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!