• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            學(xué)習(xí)心得(code)

            superlong@CoreCoder

              C++博客 :: 首頁 :: 聯(lián)系 :: 聚合  :: 管理
              74 Posts :: 0 Stories :: 5 Comments :: 0 Trackbacks

            公告

            文字可能放在http://blog.csdn.net/superlong100,此處存放代碼

            常用鏈接

            留言簿(4)

            我參與的團隊

            搜索

            •  

            最新隨筆

            最新評論

            • 1.?re: Poj 1279
            • 對于一個凹多邊形用叉積計算面積 后能根據(jù)結(jié)果的正負來判斷給的點集的時針方向?
            • --bsshanghai
            • 2.?re: Poj 3691
            • 你寫的這個get_fail() 好像并是真正的get_fail,也是說fail指向的串并不是當前結(jié)點的子串。為什么要這樣弄呢?
            • --acmer1183
            • 3.?re: HDU2295[未登錄]
            • 這個是IDA* 也就是迭代加深@ylfdrib
            • --superlong
            • 4.?re: HDU2295
            • 評論內(nèi)容較長,點擊標題查看
            • --ylfdrib
            • 5.?re: HOJ 11482
            • 呵呵..把代碼發(fā)在這里很不錯..以后我也試試...百度的編輯器太爛了....
            • --csuft1

            閱讀排行榜

            評論排行榜

            Clang 宏定義初探(二)

            本篇總結(jié)下這幾天看的宏的一些看到的用法。

            1、參數(shù)粘結(jié)

            這是一個類似 shell 之類的腳本語言的特性,可以利用這個特性完成一些重復(fù)度比較高的編碼的簡化。
            例如,對proc文件系統(tǒng)進行綁定的時候,需要在/proc/test/目錄下,簡歷3個文件接口,test1、test2、test3.
            可以這樣寫
            #define BIND(x) test##x->read_proc=test##x##_read
            在使用的時候,就可以
            BIND(1); //展開為test1->read_proc=test1_read;
            BIND(2); //展開為test2->read_proc=test2_read;

            不管是從語義還是編碼復(fù)雜度,都降低了。

            2、參數(shù)字符化

            在使用單個 # 號,作為函數(shù)式宏的參數(shù)前綴時,可以讓宏的內(nèi)容變成字符串,比如說:
            #define print(x) do{\
            printf(#x);\
            printf("=%d\n",x);\
            }while(0)
            使用的時候,直接寫:
            int t = 1;
            print(t);
            結(jié)果會是 t=1,這個在做日志的時候還是非常好用的。

            3、do{...}while(0) 和 ({...})

            可以認為是前者是 void 函數(shù),后者是有 return 值的函數(shù)。
            入2中所示,do{...}while(0) 是為了產(chǎn)生一個程序塊,當宏里有多條需要語句需要執(zhí)行時,如果不適用這種do{...}while(0)的形式,可能導(dǎo)致一些隱形的錯誤,例如:
            #define print(x) {printf(#x);printf("=%d\n",x);
            正常的:
            print(t); 是沒有問題的,但是如果放在程序段里:
            if( flag )
              print(t);
            else
              print(a);
            展開之后,會發(fā)現(xiàn)為
            if( flag )
            {printf("t");printf("=%d\n",t);};
            else
            這個語法就錯了。因此,當代碼段比較多,且不需要返回值時就用 do{...}while(0)吧。
            另外一種方式屬于 GNU 的擴展,后續(xù)在看。

            4、多重展開

            還是基于打印的例子,我需要打印一些列舉的參數(shù)值:
            #define P(x) arg##x
            #define print(x) do{printf(#P(x));printf("=%d\n",P(x));}while(0)
            這個編譯通不過,換成以下方式即可:
            #define P(x) arg##x
            #define __print(x) do{printf(#x);printf("=%d\n",x);}while(0)
            #define _print(x) __print(x)
            #define print(x) _print(P(x))
            修改成這樣,解決了想要的解決的問題:
            int arg1 = 1;
            print(1);
            輸出結(jié)果為:arg1=1
            主要涉及的問題在于宏的多次展開,宏每次展開只會對當前的輸入?yún)?shù)進行一次展開,當你的輸入值也是個宏的時候,就需要使用過度宏,讓你的輸入接著展開。
            對于多次展開沒有從最根本的原理解釋,只是從實驗感官上對這個特性做了分析,實際上,自己也不會寫出那么復(fù)雜的宏(怕中間調(diào)用出漏洞)。

            宏的基本常見用法,都差不多枚舉了一番,往后在見到更高級的玩法和比較精髓的寫法往后再慢慢補充上來吧,另外GNU的擴展也會在后篇繼續(xù)學(xué)習(xí)了解。
            posted on 2016-03-11 01:20 superlong 閱讀(1950) 評論(0)  編輯 收藏 引用 所屬分類: C
            国产精品久久网| 国产精品99久久免费观看| 国产高潮国产高潮久久久91 | 国产精品美女久久久免费| 久久久国产乱子伦精品作者| 亚洲熟妇无码另类久久久| 浪潮AV色综合久久天堂| 久久人爽人人爽人人片AV| 久久青青草原精品国产| 久久99精品国产麻豆宅宅| 99久久精品免费国产大片| 久久久WWW成人免费精品| 少妇人妻综合久久中文字幕| 久久久无码精品亚洲日韩蜜臀浪潮 | 丰满少妇人妻久久久久久| 国产精品久久精品| 久久r热这里有精品视频| 国内精品欧美久久精品| 婷婷久久五月天| 精品国产VA久久久久久久冰| 久久香蕉一级毛片| 久久无码AV中文出轨人妻| 久久99精品国产麻豆宅宅| 国产精品9999久久久久| 久久久久久亚洲精品无码| 7777久久久国产精品消防器材| 国产精品久久久久影院色| 久久久亚洲精品蜜桃臀| 久久久亚洲欧洲日产国码aⅴ| 久久亚洲精品中文字幕三区| 久久人人爽人人爽人人片AV东京热 | 精品久久久久久久久久久久久久久| 欧洲国产伦久久久久久久 | 久久久久人妻一区精品色| 亚洲午夜精品久久久久久人妖| 三级三级久久三级久久| 久久精品国产亚洲AV麻豆网站 | 人妻无码久久一区二区三区免费| 久久亚洲日韩精品一区二区三区| 青青久久精品国产免费看 | 亚洲色大成网站WWW久久九九|