From 3a495d7fa241391e8bf04f35d675f446f039a024 Mon Sep 17 00:00:00 2001 From: light-city <455954986@qq.com> Date: Sun, 11 Aug 2019 13:24:05 +0800 Subject: [PATCH] update dir --- README.md | 1 + macro/README.md | 232 ++++++++++++++++++++++++++++++++++++++++++++ macro/do_while | Bin 0 -> 9464 bytes macro/do_while.cpp | 76 +++++++++++++++ macro/sig_examp | Bin 0 -> 14360 bytes macro/sig_examp.cpp | 86 ++++++++++++++++ 6 files changed, 395 insertions(+) create mode 100644 macro/README.md create mode 100755 macro/do_while create mode 100644 macro/do_while.cpp create mode 100755 macro/sig_examp create mode 100644 macro/sig_examp.cpp diff --git a/README.md b/README.md index 2e99f93..516666b 100644 --- a/README.md +++ b/README.md @@ -29,6 +29,7 @@ - [x] [enum那些事](./enum) - [x] [decltype那些事](./decltype) - [x] [引用与指针那些事](./pointer_refer) +- [x] [宏那些事](./macro) 代码运行: 全部在linux下用vim编写,使用gcc/g++调试!全部可正常运行! diff --git a/macro/README.md b/macro/README.md new file mode 100644 index 0000000..d20b612 --- /dev/null +++ b/macro/README.md @@ -0,0 +1,232 @@ +# 宏那些事 + +## 关于作者: + +个人公众号: + +![](../img/wechat.jpg) + +## 1.宏中包含特殊符号 + +分为几种:`#`,`##`,`\` + +### 1.1 字符串化操作符(#) + +**在一个宏中的参数前面使用一个#,预处理器会把这个参数转换为一个字符数组**,换言之就是:**#是“字符串化”的意思,出现在宏定义中的#是把跟在后面的参数转换成一个字符串**。 + +**注意:其只能用于有传入参数的宏定义中,且必须置于宏定义体中的参数名前。** + +例如: + +```c++ +#define exp(s) printf("test s is:%s\n",s) +#define exp1(s) printf("test s is:%s\n",#s) +#define exp2(s) #s +int main() { + exp("hello"); + exp1(hello); + + string str = exp2( bac ); + cout<(b) ? (a) \ + :(b)) +int main() { + int max_val = MAX(3,6); + cout<0) + fun() +``` + +这个宏被展开后就是: + +``` +if(a>0) + f1(); + f2(); +``` + +本意是a>0执行f1 f2,而实际是f2每次都会执行,所以就错误了。 + +为了解决这种问题,在写代码的时候,通常可以采用`{}`块。 + +如: + +```c++ +#define fun() {f1();f2();} +if(a>0) + fun(); +// 宏展开 +if(a>0) +{ + f1(); + f2(); +}; +``` + +但是会发现上述宏展开后多了一个分号,实际语法不太对。(虽然编译运行没问题,正常没分号)。 + +### 2.2避免使用goto控制流 + +在一些函数中,我们可能需要在return语句之前做一些清理工作,比如释放在函数开始处由malloc申请的内存空间,使用goto总是一种简单的方法: + +```c++ +int f() { + int *p = (int *)malloc(sizeof(int)); + *p = 10; + cout<<*p< + diff --git a/macro/do_while b/macro/do_while new file mode 100755 index 0000000000000000000000000000000000000000..ce870355a31e584f8a9410bf0885232b45550550 GIT binary patch literal 9464 zcmcIqeQZlT+L&NNTM1OUQf*(Q>^M71knZgkLNb*NI9X z75Mq3hPYW`KCMDCuU2+t;N|$WI8C6%>6ZoO*O@SCFo|18oa)PyUlmP$ah@qM7s4X} z@}ss+EB*AmK8Z8muiEhxHB6F6J_#njMJ_3V_sIhDbE;v?xqs9*`t_)|Jx)I)lKsR) zyL{$3*%EDe+lWfvT2n5s^~(bDdrep{XTNX3kJ|Y~$*l~#RDGq!rCPP0x$3UCJrVD3 zZn`}YU73g{vm+}FMOH(Vml<`QuZl!)_~!rf}WLzEQ9lluEw zm0!yIxE}S^i^XEUyH7%H$da%gGDb9V+ikQ4nuV_K97-kij1f*7x-RsMyY#Nu&UnU% zrP~tWOeU5QdZ?#UkH*pp?&)kxq>{0oaDO6Z>WXW&Z|XK$;;D?@AI`*@Ldm$%?hEb` zI`C8?6Wp@Ct2@=L2LW^&O|fJ&5sGvhK3`-ooYswWIBsM@kzlY3*lI+GNAy(2NXNoM zp&q@bQ4e-EqqVc^Xfx~RHWHc87Yi5ZL9jLYmTyMPrbJR%BiG8fz<5P?s3Id_J#55A z;)WOsClV=m=%iP}Hx!O1#Xve16B{~0t!?@$?<(&av%GDazS`S_2{5;*6MKsOk!(Jl zD3Q*Ae?H6=ulwxccn$5q0X2W5r=q#TgfNyphNH|W(n>#F*9Wb67OEpb%DfKfOs;^d1*bZg{1#jt*;1uhaCAIJTP*mT94f>% z3$Bi0sqM4ibPh3TqwiO14_7=>?Gf6+lSaklX=t?3m#T?dXlBi0FqygKaXjmm`cWcz zkSwOo&46w>Ofn7G)N4}y4#_m+Qzxaohh&=EspC>klT1T7^^}zFBbkP9>Zp|aNv5Hj z+ArnpB-4;h4NJL;WO{8)^+|an$u%Tzk@BCaJYwJ|WJ$gcLSwJ*(8m6*jh?@-r6)9T z^4wg%&?Zg|OEz(Ej$cgP4abWEbxYfYc=16D*j8=j2$(iH?b62H-nHaK3PrE;Y(rVL}%C?Fpg45JN z7;x`4TD^Y{VIp`rDorl4$*oqCA3(6U&$a6IK{#sm^2C2~1EX0@?jhkyPPf9UTSr3P z&u!J+ROol{vSnzhpp&yS`9loSq#H9VyWN``@3Fm?$FkF-doMe(w;tF#Ju`zPbi?@f z>M^_95$SisnCBBDj?)Wrau+b}2icC(bWc7{tL=1tEz`;l+#R?pFg6p|8tCaba?38K z2aEg2%6;J7p|MM$v9le^Xr)zar#>y4eD)K}&A|^0kMB+14;^Fgc8pzWM}(OLZ)u~a z9opLWvhUJCb5C#J-av0)M?gP)G+*b(IDce3brd;prps5!fUjYh7+8gea4adiV;dSw z6P-YnPlK;Oj|}h|F;uUDKMDRm_yP=AEqZqVdD&G|>RV0*ii+C{aWnK}fAYUGGsnr+LaTm@sc#2Xj&b`7^fA)6y4>G&wz?KQS{8J9 zj+D2$8Xl?8T#bh+HCM}MRj13JcC`dtjR99ftIGpB*tfc><+#(l2+Wi9eN7=H)%Ydr z#Lgl*S8Z}B;6biLc23_AMEp+Fu>6VmU3gx_yH=uf-|Ca4B}(S+i^WQ=#_>x;^F~B3 zBBFm^nMn~p=JXTG-TAa~Q|51hmz}0eYnN!BYTsN_6pIv>W39@>=mjbX8<~j5=z^5; z>z2PQu2J~5O1~^I-k@Y|ccZeaQJm|?G|2u;R+#?S9#YQLtK>6EuiXFdjPJ4biVmrH zeM0e{DgGP9&nW(e;_oPaN%2axp02j7E3RilTie$?4O{!ONh9l7<8AUbu58Xq$+yqf z>}_oF`h3ewg=bZxueq_gaV`6n;$>K^El&R|bs1*2rzl<~jG}mXZrxdfm0=a~dMm^$ z1+U9Oyh;?C&oZoXUI&HtHGjdxTLfkDbsC{0D*9*>56yozmpUPtt;#cL)heCXT;B%o6UnuBv%}!RevNsw)%M z2)?%z;@FjH-xuQ7iov3I{=Qpi&!<`*rQ@eue1va+LZb81A!fIq&PgZ6zt1)=6q)d+ zY`9n9_Vb$F8xGvdkK&tzh|leAS)M(fdw^4Xq22@JLv#o~hnPJt&j2shuNS2KVnN?R zL|pGFlqr6lS|{>d2<#(;^LvNSq_)C%!5>^-V%Wxpzc|5(PKz27G!ZjE4;-!Fkv!;1B5X$gF- z!tHsc9l$-as}*~sy-O^bJ67kOfuSZsc&#Q73^K1$Ge*pI=8!K~QoZUs{ zQOI#{iLct`%LV&-=e2^atyWr0c#-^>PubJO!b*1nr}?GpHBn4H@qG*2jX3uBThSiE zkE#8r%*A#Yhow9pQMf(-cT&cm-Tnz_?-F#+Cps*jxMN7X$onXgHZn$bV8BaBt&MG6 zdPk_c2N}V9;!ih*^a!Q?kP_6RDSc-m)gMmiQ6rVk=;7>$h@^&w6EPze^?q&5+NR=0 z`anDx*Td;_c()!)8tL7*<%EY~dNeyUv>PrKNr$CTV2Vl~7>p-k-pKHd&8>kBxMchFkgjj{4InwG zukQ+U2KC^kc1niIao{pC;CfI~23mVpF2d&Z>$`(UN(Ndxg5*@t>}Vk%^Q=N||MsRp zXQ(ZoX7u}I%21^V_3f($WNTz{F_Ov3QA4E9&(#*sh!%!7bC(KJS;|?7OuIUt`?P6h z*GPHZ!Wus_g^bQdC@=h_a<=w*He(4y<4HZ6iACiF+SXdiWf#v^>(Q_gHZ!>xX=J&1 z6;OVflESvC^k^of4`OLi8r)0+(@dF*QSZ-WIF>EpZ42|Iv){HjF={^2(nvuIZ)W$9 z5$*>!(k36|Qap*w{;=>SQ%1}iXbr72!aJ3;Gnw`FXXE%&Q9LTVBn^f$gTfo#okTp7 z8);LsE0)e+XB7xKbm>?kOb)6voG^q}j))gU@6HrNV*o}e*=lcWP;LCdD1xwL zx|%0|>A~guA}~WW;h}g0ZAcju9taJA7eg<+IE#jGzNl00%QO1E!%>}kkMq5S{~pTs zVXlE}t#lIvx`X0%C5i7h{P#wW!kO`Vk7XYUR)4++87kn-Y^b>1za97`+*!H)V@|)c zJf;A?2Ukcmf3H`f*n|Sz(b=ExRWB=Gzv?jE^Ql;k9}&LPB;AE4UO72`zJF<|p_~UW zt@GcdEbl;p?%-TM-_y>h278ntx1a5p-w!?A=~?Fc+@x~wD}QP~*>L+6Ea>~2n#%rs z?`u$rjZ)*s{eMXLx2k}AKisDLIgdfjAs?=v{T~HJ@P`dErVdDD?|33ixc-j5W!ne-i&-e9e3JS8@+vUH(hMLIr^S$2v1^wTF zFRfkn=R6kwKaF#$|Gd7re(u*XTm76Tn5IsF*xr=#GUFdYVQqgdpP(ujWJkr>kNLFC zpYslb%AecGVc3u5D<}}g{ii=X5sfIvMXLW2#KXe{#mk^4lSUiP{%dSFhhtt3J=bkD wU7=oFwQQ)AHc{5id&la3T($qWI!A7Raut5ue?Grxe-^91PZ_*wQ`+nQAF=<^y#N3J literal 0 HcmV?d00001 diff --git a/macro/do_while.cpp b/macro/do_while.cpp new file mode 100644 index 0000000..68af132 --- /dev/null +++ b/macro/do_while.cpp @@ -0,0 +1,76 @@ +#include +#include + +using namespace std; +#define f1() cout<<"f1()"<0) + fun(); + + if(2>0) + fun1(); + + f(); + ff(); + fc(); + return 0; +} diff --git a/macro/sig_examp b/macro/sig_examp new file mode 100755 index 0000000000000000000000000000000000000000..b3423603ba11d3e62a3314c1f6e6bb20c5dc9dc3 GIT binary patch literal 14360 zcmeHOadcbNdB3vk*ddPMBu?uk4N*GMIk2cw>=@IIBHK}riIaG?lV(78mL=I1kt|nw za-FQKrcP2!2>5huN!zn?*kGJ)>mX%2T@G}P!8vievU38Z98Os`wk3;H3UeW&?gn_j z@4oxVPfvQ?+MWKh?)SUj_uYHHd*6L}_kI3spkr5=!y%Z;#3uwvW7U2M8Q((G zd8MeZX0crOg{9L7#idU5 zpSc>Y_-H)V*VOpYcw}2VHk29NHrm{@t*OzIPI|V>ag%@2y>;(?*%HUm4T;8Aiw}jG z>d%iq>c8^vb5jQ=zy6t>a~qFN-|)+V+7s%FM~%ADHMe)`@pOB*Tle|GgQ1kBr$R9u zK%hH>uRs?n8u~)%SXfJ@^;9&JXz$T_yjr09My+f2-fsOyO$(2X`h33ah8C1!Lj&#I zjav5(t;eSY0z$ieuXMK47Z{O(-W*G&HRwkh+lOL$9#6*8fzDlB-N|kZR@%Vms5Tr; zrISOUcuYT{jd;m=w{4rYgJ?|0jz+m{n-1F=xA_8{yTe_(yBiR9M5{466p5D#*e{4x z6PX%8fV+}GSj2zX4yy3Uc`TmBQoRcIVE%S!7?v@ja5AII4$=g~@}&f=!hvvDOVc9s z32pz-r(;7Ath{t45v9s7uTCt?@L?@Hcv$NX#o}TZYe4VE6oyAbT1bzM#^7Hg1GR(` zq1cePwXIES@OVYr!GkTW?V8WiAa3nwZ-ofB(X-uW7LBsD-P4#aZTIY;i>XZR?6kj^ z;m_FT%OO?ZL)`dOqC|hjUCV);{_{}geYf)?M^*??DK3)(kOP{yG-bUX{QFNH#?OFd z;tgfNLRQGcSdh(d6gSn`U#a7ZUiM6PwHZ$vE%cO3k$uL(!M@-%3|U3pZ9VH3W}gpZnViZ|1k38(uy(|smf z{S=Z_lP27JUpj5V>(~kSBPM*U3IDnYr{5w>!SSC|1y5G|sMall$EWp*>~73vaQuAL zjG?ix<3&_0YdZeS_-)_DSwq@S^~LYDSv@v`q`Q5mGb>0)0F2rrTjUPuOZnl z<)b9i)aSfXPLWJgo^wn2Zjx!Lb2U=#BblZ+C!~Bk$uzaOx%UBV=^~k?H20d6ZzGwe zEO$}Ltt8V_<))?lxwUT5KM7fq?~V3}7w!s9{7Z2B(p+ax`|R{1HGUDCeby`4?8r*L z$j-v>YX7QD`0;yo78AEWxNRCNI6m(RPFx<@aF$%rbge#gjw%*jgYq%y|IiH0Qoo1g zDXQNey!TD%;Mw<`a1flB3qG5@CFr;ieBph4UEbRY_O@!1I5cClKX&t1FdmUvy&s0z zAq3#ig^Ck^9B<2(&Ivpq1jla?nTpr{5O#TIKP7{Oi-&SYVMFEa;JrUNjXp+#C(F0g z(*Py{S>N>3Sq%K#6uzWs_G|AgELgG60}Gxy9)_pj#B6pD;R&Alk`zxJr&TfaJVg&x zH_NKL=9`8gsZi~|lQ=O0R|axHMlah8qp6F^!|zL-eQkJ+=_2i2i{~m;AphC8C z7g+$*wSIC%OjE`})*&(ZJWY!cYycct|d>7Ju)Ec+yaLYL7P1kv)zmIEyl3oZLw zdOA*Rd3>cC7t^V2Pk?u~PrTDU@q>=7)N)nu+4r2;C;t88NW2Rp|G=g0lvwCPr3NDqMDiBR1M-i5fo1pXARnRmfy zPy7(VR*j(j4)|xlkAd?&#&NVuI7Vw68>%a-CLNVEgwq+vJp5h{&Qw|-=K@e5{n4K< zEcoG9xN3H}>TX-L;?q@Q;+FLvzrNwR50eklA#xn;?2s*1I_Z(dX|!wjAzvdHM=wHJ zetwN#w76cG zdg}+xy9vean-lF+|Yx5 ztE)=JuNLE-gCAoBkTZi87978Q{cm7RRJ`RBCmbz*T`qEtiigU@v9f0zkCuz?IV%AD z(76L$DL4PvVh2lnDFRCoSc1ePMO6oI7(EJa``0{_n<(1~*tqFOv56M2;^1$@z? z1d)}~nXDP7GgP8#gNYhEHxlvL;A6@^evV7x_pBR~%x8b=l{~NB!}9YA9b^&x$NLLO z;-|~}#PaWa>njYI&qgnn88RJk5p8uEoXl;{JBe?;*n#dj%wK=FRXrIG0i zuPi?1uHWC68PYTE9e7FM-PV+mlJ5_EO&)Kf$LHH>RJgZ$eNEmb?@cE2l0|yc&|Ky( zs-yQAJtc9c&`aXw`SojdMsGrR-4^1@1h4Nxyi$}}7fw+ncs&*BFBiNn3-N0Nuirv^ zMgBT2#H)o@%~v75QVf@v52tYD^F|8wR|(!13h^3oM(r1c`09M#Lm|EfC(C{_B+E{* zR?zWY=}?{o4@3YcBomZ8Fd41sCO`k}L?Qt_l#O7+t%J661I8>FA&_0TT$Ym3(5?FzT9 z+l2H}ybk{rH!im*URNW~UqhX>(ET>}A4}XN=qx>fH-Ac#I zrfu-Qkp7GJftMt1_F$BMZi7=EQmJumSGYCL9vZPj@#(J44mRjukFnA zBOCpnDco=IUx)MGQvG?r2B*|WiYL8?B3cBl(=t(Q+is@^!Iy^%AwuX)}?i{ zclRJeXfY8;(-T^lQh|^nq(ze2Ks?zOifa))nM!M+%%}(_6T|VS9*uZz+;LN5X(g>c zHWbrBsZ{8Q79G-4M?`-rl!$7POd@dvCMHRPre2_$jtywh(NJR86CNIx87Cdhniflv zBE&|YMp+>`Qj7?RA=&3BB&0iqkZcmcJC{@@EM;#D$tkyX>}zf5fJvrLYu98ViKgx9 zYS|Oe0(*B-a+Hh%myz+O1%gT;xU(zoVBfA?-2vn>wX}8w$f%&(kwQS`T?uXH@9k~b z)83}iTl{{Rt%8&kN<^Xj9+^I)U?YhIZe-R=IGvFpg#14za>0`&LyD4vO8PYt!YBxq z-k36PEH%a6DS^o1{TJnu85v{0Y^IU5fqj_sNNh;Uq@xHnwO2YnO^bx|kdZYcV{Dgj zW}ClNG&)Kw;@L`Ax}_m)j+YVTdQoPSRV9*6YJ*sslvlSnyT)SH`qF9cEOAp(lyW08 zm^c}%sBhGLCpr__xa#CG^0^0gjv)QbE?DGI^r^S?3SKv){J4%x-Cy9~}ORfIm z+(5tIlt)HG`!%OE7WcX!Jr30>y-j%1M-qCd4_r?fe2_~>lZ&Q?g=Z+KM?FY_+op#G zlr%7u@$_Y4NO_J$gomWTPs2M?)BsR@M~8I{iOqx&Zl>ql~Km+zJTbxz1g0h&voVSx&rND`<Hmv^cGRMky_xOY!-S zg2i4G=nRVO`Fa1M0uCxp=U6m$w&(Mr1HkYTBX7^=0`>TvLd54>hGh8QGV#0cp))3K zpU)4vR72a9vT~PihxHGmp3baT=5vPol>MZ#r~Xqvx&I0l^!!J2!uEU~QMcUC@G3=a zpY3`4$CQ1m(&KZBpt9$4IC!{m&cT%3L~o* zT|a-O?0Nq9dFYI?PvtF*g0=tOwAl0iukio1(Dh{|%W%XwR8s%BeLnY*nT5dbw8Y=q z{&y|*d_Htu{rLBy-b@yE;#E|-@S(L$#LwgWe=^p1Tid?^n^pL*J)bwtZzOMv>(!8o z<+o8mePa9kxz4qQg|$7aJP$R#Hpzm|d8?E?|GyGnA8gO#It?3h`+UwdzlppR_m}ON z({q#AK7StOmgeG&!Sdg1$NUmiH`~v<4e6j7Fil4TK0JQjKk51| U)qdwz!~QYecnwjur;3vOH|(?W-T(jq literal 0 HcmV?d00001 diff --git a/macro/sig_examp.cpp b/macro/sig_examp.cpp new file mode 100644 index 0000000..85290a7 --- /dev/null +++ b/macro/sig_examp.cpp @@ -0,0 +1,86 @@ +#include +#include +#include +#include + +using namespace std; + +///=========================================== +/** + * (#)字符串操作符 + */ +///=========================================== +#define exp(s) printf("test s is:%s\n",s) +#define exp1(s) printf("test s is:%s\n",#s) + +#define exp2(s) #s + + +///=========================================== +/** + *(##)符号连接操作符 + */ +///=========================================== +#define expA(s) printf("前缀加上后的字符串为:%s\n",gc_##s) //gc_s必须存在 + +#define expB(s) printf("前缀加上后的字符串为:%s\n",gc_ ## s) //gc_s必须存在 + +#define gc_hello1 "I am gc_hello1" + + +///=========================================== +/** + * (\)续行操作符 + */ +///=========================================== +#define MAX(a,b) ((a)>(b) ? (a) \ + :(b)) + +int main() { + ///=========================================== + /** + * (#)字符串操作符 + */ + ///=========================================== + exp("hello"); + exp1(hello); + + string str = exp2( bac ); + cout<