第1宏技巧:把枚举转化为字符串
#:它的作用是给其后的参数添加一对引号。如下所示:
#define CaseEnum(a) case(a):LogMsgToFile(#a, id, time)
switch( msg_type )
{
CaseEnum( MSG_YouWereHit );
break;
}
在编译器进行了预处理后,以上代码就会变成以下形式:
switch( msg_type )
{
case( MSG_YouWereHit );
LogMsgToFile("MSG_YouWereHit", id, time);
break;
}
第2个宏技巧:利用二进制表达式得到编译器常量
另外一个特殊操作符是##。这个操作符能让你把两个参数连接其阿里啊,如下所示:
#define cat(a,b) a ## b
value = cat(1,2);
等价于:value = 12;
第3个宏技巧:给标准断言添加描述性注释
#define assertmsg( a, b ) assert( a && b )
assertmsg( time > 0, "The arg time must be > 0");
第4个宏技巧:编译器断言
#define cassert(expn) typedef char __C_ASSERT__[(expn)?1:-1]
cassert( sizeof( MyEnum ) == sizeof( unsigned int ) ) ;
第5个宏技巧:得到一个数组里面的元素个数
#define NumElm( array ) (sizeof(array) / sizeof(array)[0] )
第6个宏技巧:在一个字符串找那个加入__LINE__
LINE__ //在此变量出现的地方的程序行号
__FILE__ //程序的文件名
__DATE__ //程序编译日期
__TIME__ //程序编译时间