宏替换只作替换,不做计算,不做表达式求解,不做类型检查…可以用#undef命令终止宏定义的作用域。宏定义可以嵌套,最多替换200+次(具体记不清了)。防止文件重复包含#ifndefXXX_H_#defineXXX_H_…#endif编译过程控制#ifdef_DEBUG…#else…#endif定义常量##definemax(a,b)((a)>(b)?(a):(b))包含多个语句的宏#definemsg(str)do\{\…;\…;\}while(0)#和##的用法宏替换会把#后面的内容作为字符串进行替换,例子:#definePASTE(n)"abc"#n替换之后相当于”abc””n”比如PASTE(12)->“abc12”##用于把两侧的参数合并成一个符号,例子: #posite(a,b,c)a##b##posite(12,12,11)->posite(“aa”,”bb”,”cc”)->“”注意:当宏参数是另一个宏的时候,会递归展开,但用'#'或'##'的(该)宏参数不会再展开。#和###wo2#definemuli(a,b)((a)*(b))则muli(two,two)的参数two会被递归展开结果为((2)*(2))#或###wo2#definemuli_(a,b)a##*##b则muli(two,two)的参数two不会被展开结果为two*two如果想让她展开只需要多加一层间接转换宏#wo2#definemuli_(a,b)a##*##b#definemuli(a,b)muli_(a,b)结果为2*2再看一个例子:#wo2#hree(a)#a#definemuli(a,b)three(a)#b则muli(two,two)结果为2tow也就是说,含有#或##的该宏定义参数不会被继续替换,其他的宏参数还会递归替换。看看下面我们代码中调试信息的宏很容易理解了吧:)#defineM_STR1(s)#s#defineM_STR2(s)M_STR1(s)#defineM_SHOWMSG(desc)message(__FILE__"("M_STR2(__LINE__)"):"#desc)注:#defineoffsetof(s,m)((size_t)sizeof(((s*)0)->m))例子:(四字节对齐情况下)typedefstructKK{ longk; charc;}T_KK;ount{ inti; intj; T_KKk[2]; unsignedintl;}Account;offsetof(Account,l)等于24offsetof(Account,k[1].c)等于20注:sutter还是mayers说这是最著名的宏?(记性太差:(又忘了),不过现在这个宏已经纳入ANSIC,。结构定义可以任意嵌套,但结构定义中不可以含有位域。也适用于union结构。常见的宏定义错误用法:#definemax(a,b)(a>b?a:b)//参数缺少括号#defineprint(msg)if(…)printf(“%s\n”,msg);//语句应使用do{..}while(0)#defineprint(a,b){printf(“%s”
宏替换只作替换,不做计算,不做表格达式求解,不做类型检查… 来自淘豆网m.daumloan.com转载请标明出处.