宏替换只作换,不做计算,不做表达式求解,不做类型检查….doc

宏替换只作换,不做计算,不做表达式求解,不做类型检查….doc

ID:59428504

大小:25.00 KB

页数:3页

时间:2020-05-25

宏替换只作换,不做计算,不做表达式求解,不做类型检查….doc_第1页
宏替换只作换,不做计算,不做表达式求解,不做类型检查….doc_第2页
宏替换只作换,不做计算,不做表达式求解,不做类型检查….doc_第3页
资源描述:

《宏替换只作换,不做计算,不做表达式求解,不做类型检查….doc》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库

1、1)宏替换只作替换,不做计算,不做表达式求解,不做类型检查…2)可以用#undef命令终止宏定义的作用域。3)宏定义可以嵌套,最多替换200+次(具体记不清了)。1.防止文件重复包含#ifndefXXX_H_#defineXXX_H_…#endif2.编译过程控制#ifdef_DEBUG…#else…#endif3.定义常量#definePI3.144.带参数的宏#definemax(a,b)((a)>(b)?(a):(b))5.包含多个语句的宏#definemsg(str)do{…;…;}while(0)6.#和##的用法宏替换会把#后面的

2、内容作为字符串进行替换,例子:#definePASTE(n)"abc"#n替换之后相当于”abc””n”比如PASTE(12)->“abc12”##用于把两侧的参数合并成一个符号,例子:#definecomposite(a,b,c)a##b##c则composite(12,12,11)->121211composite(“aa”,”bb”,”cc”)->“aabbcc”注意:当宏参数是另一个宏的时候,会递归展开,但用'#'或'##'的(该)宏参数不会再展开。a.宏定义中不存在#和###definetwo2#definemuli(a,b)((a)*(b

3、))则muli(two,two)的参数two会被递归展开结果为((2)*(2))b.宏定义中存在#或###definetwo2#definemuli_(a,b)a##*##b则muli(two,two)的参数two不会被展开结果为two*two如果想让她展开只需要多加一层间接转换宏#definetwo2#definemuli_(a,b)a##*##b#definemuli(a,b)muli_(a,b)结果为2*2再看一个例子:#definetwo2#definethree(a)#a#definemuli(a,b)three(a)#b则muli(two

4、,two)结果为2tow也就是说,含有#或##的该宏定义参数不会被继续替换,其他的宏参数还会递归替换。看看下面我们代码中调试信息的宏很容易理解了吧:)#defineM_STR1(s)#s#defineM_STR2(s)M_STR1(s)#defineM_SHOWMSG(desc)message(__FILE__"("M_STR2(__LINE__)"):"#desc)注:这段代码引自mtp3.h1.求取结构体成员偏移量的宏定义#defineoffsetof(s,m)((size_t)sizeof(((s*)0)->m))例子:(四字节对齐情况下)ty

5、pedefstructKK{longk;charc;}T_KK;typedefstructT_Account{inti;intj;T_KKk[2];unsignedintl;}Account;offsetof(Account,l)等于24offsetof(Account,k[1].c)等于20注:sutter还是mayers说这是最著名的宏?(记性太差:(又忘了),不过现在这个宏已经纳入ANSIC,在stddef.h中。结构定义可以任意嵌套,但结构定义中不可以含有位域。也适用于union结构。常见的宏定义错误用法:#definemax(a,b)(a>

6、b?a:b)//参数缺少括号#defineprint(msg)if(…)printf(“%s”,msg);//语句应使用do{..}while(0)#defineprint(a,b){printf(“%s”,a);printf(“%s”,b);}//同上,否则无法用于条件判断语句中附录:I.ANSI预定义宏__FILE__当前源文件名称。__FILE__扩展为用双引号括起的一个字符串__LINE__当前源文件的行号。该行号是一个十进制整型常量。可用一个#line指令修改__STDC__指出与ANSIC标准的完全一致性。仅当给出/Za编译器选项且不

7、编译C++代码时定义为整型量1;否则是不确定的__DATE__当前源文件的编译日期。日期是格式为Mmmddyyyy的字符串文字。月份名称Mmm与在TIME.H中说明的库函数asctime产生的日期一样__TIME__当前文件的最近编译时间。该时间是格式为hh:mm:ss的字符串文字__TIMESTAMP__当前源文件的最近修改日期。日期是格式为DddMmmDatehh:mm:ssyyyy的字符串文字,这里Ddd是星期几的简写,Date是从1到31的一个整数表II.常见预处理指令列表指令用途#空指令,无任何效果,如果后面跟上非下面列出的指令用法见上面#

8、include包含一个源代码文件#define定义宏#undef取消已定义的宏#if如果给定条件为真,则编译

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。