青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

posts - 16,  comments - 34,  trackbacks - 0

題目有點(diǎn)繞口……

問(wèn)題見(jiàn): http://bbs2.chinaunix.net/viewthread.php?tid=1373280

 

問(wèn)題描述

 

問(wèn)題解答

 


 

問(wèn)題分析

需要注意:
I. 宏是作文本替換
II. 替換的終止條件是:文件中不再含有宏

對(duì)第9行的:SET_NAME(1212)
1. 首先根據(jù)I和第5行,SET_NAME(1212) 會(huì)被替換成:CONNECTION(test,1212)
2. CONNECTION依然是一個(gè)宏,根據(jù)II,繼續(xù)替換
3. 根據(jù)I和第4行,CONNECTION(test,1212),被替換為 test1212
4. 所以第10行最終會(huì)被CPP替換成 "int test1212 = 1212;"

對(duì)第12行的:SET_NAME(VAR)
1. 首先根據(jù)I和第5行,SET_NAME(VAR)會(huì)被替換成:CONNECTION(test,VAR)
2. CONNECTIONVAR依然是一個(gè)宏,根據(jù)II,繼續(xù)替換
3. 根據(jù)I和第11行,CONNECTION(test,VAR)被替換為CONNECTION(test,326)
4. 再根據(jù)I和第4行,CONNECTION(test,326)被替換為test326
5. 所以第12行最終會(huì)被CPP替換成 "int test326 = 326;"

對(duì)第16行的:SET_NAME(VAR),同第12行,最終會(huì)被替換成 test86



為什么setname不行?
setname(var) 會(huì)被替換成 testvar,而后者不再含有宏,替換終止


 

常見(jiàn)應(yīng)用

根據(jù)行號(hào)命名——為了取一些相互不沖突的名字,使用行號(hào)作為后綴。
因?yàn)?span style="COLOR: #0000ff">__LINE__也是一個(gè),所以需要這種方法。

例1,Loki::ScopeGuard

Loki::ScopeGuard

 

Loki::ScopeGuard MACRO 示例


 1// Loki::ScopeGuard macro sample
 2// Loki::ScopeGuard : 范型、輕量的RAII技術(shù) ,對(duì)資源管理與異常安全提供非常強(qiáng)大的支持
 3// 該處僅演示使用__LINE__作變量后綴名的方法, 暫不討論Loki::ScopeGuard
 4
 5#include <cassert>
 6#include <cstdio>
 7#include <stdexcept>
 8#include <string>
 9#include <loki::ScopeGuard>
10
11void CopyFile(const char* input_file,const char* output_file) /* throw(std::exception) */ {
12    using namescape std;
13
14    FILE* input = fopen(input_file,"r");
15    if (!input) throw runtime_error( string("can't open input file :"+ input_file);
16    LOKI_ON_BLOCK_EXIT(fclose,input);
17
18    FILE* output = fopen(output_file,"wb");
19    if (!output) throw runtime_error( string("can't open output file :"+ output);
20    LOKI_ON_BLOCK_EXIT(fclose,output);
21
22    enum { buf_size = 1212 };
23    char buf[buf_size];
24    size_t r = buf_size;
25
26    do {
27        r = fread(buf,1,buf_size,input);
28        if ( buf_size != fwrite(buf,1,buf_size,output)
29            throw runtime_error( string("write output file : "+ output + " occurs an error" );
30    }

31    while ( r == buf_size );
32
33    if ( !feof(input) {
34        assert( ferror(input) );
35        throw runtime_error( string("read input file : "+ input + " occurs an error");
36    }

37}

38
39
40int main() {
41    try 
44    catch (std::exception& e) 
47}

48


 代碼中16和20行,根據(jù)loki/ScopeGuard.h (658)中的定義,將被分別替換成:

::Loki::ScopeGuard scopeGuard16 = ::Loki::MakeGuard(fclose,input);
::Loki::ScopeGuard scopeGuard20 
= ::Loki::MakeGuard(fclose,output);

也就是定義2個(gè)名字以scopeGuard為前綴文件行號(hào)為后綴的“變量”(名字就不會(huì)重復(fù))。
它們?cè)?strong>退出作用域的時(shí)候會(huì)分別調(diào)用:fclose(input); fclose(output);
PS:ScopeGuard的強(qiáng)大還不僅僅體現(xiàn)在這里,以后會(huì)專(zhuān)門(mén)介紹。


例2.1,內(nèi)嵌匯編或者使用goto時(shí),需要一個(gè)不重復(fù)的跳轉(zhuǎn)標(biāo)號(hào)。

make label



例2.2,做鍵盤(pán)模擬的時(shí)候,按照i8042的規(guī)則,每次寫(xiě)入端口時(shí),需要等待輸入緩沖為空。
所以需要實(shí)現(xiàn)一個(gè) KBC_Wait4IBE (key board controller wait for input buffer empty)



但是又不想有函數(shù)調(diào)用消耗,所以打算用宏實(shí)現(xiàn)。
實(shí)驗(yàn)1: 失敗的例子


#define KBC_WAIT4IBE()  \
KBC_WAIT4IBE_label:     \
_asm in AL,64h      \
_asm    TEST AL,10B \
_asm    JNZ KBC_WAIT4IBE_label


void KBC_KeyDown(byte scan) {
    KBC_WAIT4IBE(); // 等待輸入緩沖為空
    _outp(CMD_PORT,CMD_WRITE_OUTPUT_REG); // 準(zhǔn)備寫(xiě)入數(shù)據(jù)
    KBC_Wait4IBE(); // error C2045: 'KBC_WAIT4IBE_label' : label redefined
    // 標(biāo)號(hào)重復(fù)
}


有一個(gè)辦法就是給標(biāo)號(hào)加上行號(hào)作為后綴,那么在一個(gè)文件中也不會(huì)重復(fù)(使用 #line 除外……)。


btw:上面那個(gè)函數(shù)實(shí)現(xiàn) KBC_Wait4IBE ,在VC8 release編譯下,會(huì)直接被inline,并且生成的代碼和KBC_WAIT4IBE完全相同……
所以,要信任編譯器的優(yōu)化,不要無(wú)謂的犧牲可讀性~


重要補(bǔ)充! 上述解釋并不準(zhǔn)確?。?!
setname(var) 中的var同樣是一個(gè)宏,為什么不被替換?
SET_NAME(VAR)的第1次替換時(shí),同樣VAR沒(méi)有被替換,為什么第2次替換就會(huì)被替換?

根據(jù)《代碼自動(dòng)生成-宏帶來(lái)的奇技淫巧》:http://m.shnenglu.com/kevinlynx/archive/2008/03/19/44828.html
的說(shuō)法,第2次替換時(shí),涉及一個(gè)叫prescan的機(jī)制。
我平時(shí)對(duì)CPP研究不多,所以也沒(méi)弄明白這個(gè)機(jī)制。硬盤(pán)里專(zhuān)門(mén)講C的書(shū)也不多,我翻翻看有沒(méi)有詳細(xì)介紹的……

感興趣的讀者還可以參考: http://developer.apple.com/documentation/DeveloperTools/gcc-4.0.1/cpp/Macros.html



 

再補(bǔ)充一點(diǎn): 關(guān)于于宏的調(diào)試。
在MSVC下,可以給某個(gè)編譯單元xxx.c(cpp,cxx)加入"/P"(不含引號(hào),P一定大寫(xiě))命令。
編譯該單元后,會(huì)在xxx.c的同目錄下生成xxx.i,即預(yù)處理的結(jié)果。
在GCC下,可以使用 gcc(g++) -E xxx.c(cpp,cxx) (必要時(shí)還需要 -i ),查看預(yù)處理結(jié)果。



再次補(bǔ)充!

在《The C Programming Language》 2nd Edition中找到了解釋。
附錄A.12.3 Macro Definition and Expansion p207。
以下只摘錄重點(diǎn)部分:
During collection(指第1次), arguments are not macro-expanded.
In both (指帶參數(shù)或者不帶參數(shù))kinds of macro, the replacement token sequence is repeatedly rescanned for more defined identifiers.


沒(méi)能搜到ANSI C標(biāo)準(zhǔn)的文檔……

posted on 2009-02-18 23:59 OwnWaterloo 閱讀(3510) 評(píng)論(4)  編輯 收藏 引用

FeedBack:
# re: 使用宏作宏參數(shù)
2009-02-19 09:25 | 飄雪
好文,我原來(lái)對(duì)這個(gè)問(wèn)題也想了很久  回復(fù)  更多評(píng)論
  
# re: 使用宏作宏參數(shù)
2009-02-19 09:52 | 路青飛
我可不可理解為,宏中宏!
哈哈!好文!贊一個(gè)!  回復(fù)  更多評(píng)論
  
# re: 使用宏作宏參數(shù)
2009-02-19 11:50 |
不錯(cuò),終于明白這個(gè)問(wèn)題了!當(dāng)初困擾我很久,還是沒(méi)有解決的問(wèn)題!哈哈  回復(fù)  更多評(píng)論
  
# re: 使用宏作宏參數(shù)
2010-05-10 17:05 | PattersonGay
That is good that we are able to receive the <a href="http://lowest-rate-loans.com/topics/home-loans">home loans</a> and that opens new opportunities.   回復(fù)  更多評(píng)論
  
# re: 使用宏作宏參數(shù)
2010-08-08 14:31 | ringtone
Any human in the our world wants to stay original, but does not know the correct way to do it. But thousands of different people look for the ringtones download or just composer ringtones to be unique.   回復(fù)  更多評(píng)論
  
# re: 使用宏作宏參數(shù)
2012-07-02 09:25 | on line essays
To my mind, here only we receive the groundbreakingnewfangled brilliant data just about this good topic and that can be easygoing for men to buy term papers or buy an essay bestwritingservice.com from the professional custom essays writing firm.   回復(fù)  更多評(píng)論
  

只有注冊(cè)用戶(hù)登錄后才能發(fā)表評(píng)論。
網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問(wèn)   Chat2DB   管理


<2009年2月>
25262728293031
1234567
891011121314
15161718192021
22232425262728
1234567

常用鏈接

留言簿(8)

隨筆檔案(16)

鏈接

搜索

  •  

積分與排名

  • 積分 - 198828
  • 排名 - 134

最新隨筆

最新評(píng)論

閱讀排行榜

評(píng)論排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            午夜精品久久一牛影视| 国产欧美精品在线播放| 久久aⅴ国产欧美74aaa| 久久免费国产| 亚洲乱码国产乱码精品精| 可以免费看不卡的av网站| 欧美乱妇高清无乱码| 亚洲免费人成在线视频观看| 欧美一区二区成人6969| 亚洲精品乱码久久久久久按摩观| 亚洲午夜久久久久久久久电影院| 欧美性感一类影片在线播放 | 国产精品视频在线观看| 亚洲电影免费观看高清完整版在线 | 亚洲一区二区欧美| 亚洲国产成人在线| 久久国产欧美精品| 在线综合亚洲| 午夜在线视频观看日韩17c| 韩日精品视频| 久久久免费观看视频| 欧美自拍丝袜亚洲| 在线观看成人网| 国产亚洲欧美另类中文| 麻豆国产精品777777在线| 日韩午夜在线视频| 亚洲欧美日韩精品久久久| 黄色日韩在线| 宅男噜噜噜66一区二区| 国内精品久久久久久久影视蜜臀| 亚洲大片在线观看| 欧美日本亚洲韩国国产| 美女视频黄 久久| 欧美日韩中文字幕在线| 亚洲一级在线| 国产精品久久久久国产精品日日| 夜夜嗨一区二区三区| 性伦欧美刺激片在线观看| 葵司免费一区二区三区四区五区| 亚洲欧洲99久久| 欧美激情久久久| 麻豆久久精品| 国产欧美一区二区精品婷婷| 一区二区国产精品| 一本色道久久综合亚洲精品不卡 | 亚洲欧美一区二区视频| 亚洲专区国产精品| 国产亚洲视频在线| 亚洲欧洲在线免费| 国产日韩一区二区| 亚洲三级电影全部在线观看高清| 欧美色另类天堂2015| 久久人人爽人人| 久久九九99| 国产精品户外野外| 亚洲一区二区三区色| 国产精品九色蝌蚪自拍| 亚洲一区二区三区涩| 在线看不卡av| 久久漫画官网| 麻豆久久精品| 亚洲国产美女久久久久| 欧美午夜精品久久久久久人妖| 一本色道久久综合精品竹菊| 国产精品一卡二| 亚洲欧美成人| 一区二区欧美激情| 亚洲欧美制服中文字幕| 日韩视频一区二区三区在线播放免费观看| 亚洲欧洲另类国产综合| 国产精品国产三级欧美二区| 另类成人小视频在线| 欧美一级黄色网| 久久精品在线视频| 欧美精品福利| 久久久视频精品| 欧美一级久久久| 亚洲天堂av在线免费| 在线精品一区| 欧美成人免费在线视频| 一本久久综合亚洲鲁鲁五月天| 免费观看亚洲视频大全| 亚洲最黄网站| 一本色道久久综合狠狠躁篇怎么玩| 久久人人看视频| 亚洲高清色综合| 欧美大片在线观看一区| 欧美成人亚洲| 亚洲国产另类 国产精品国产免费| 亚洲国产毛片完整版 | 亚洲精品在线看| 最新日韩在线视频| 一区二区三区四区蜜桃| 性做久久久久久久久| 免费一级欧美片在线观看| avtt综合网| 欧美日韩国产综合久久| 韩国精品一区二区三区| 日韩一级大片在线| 亚洲成人直播| 久久久久久久综合色一本| 国产精品网曝门| 亚洲专区在线| 亚洲综合国产精品| 国产精品极品美女粉嫩高清在线 | 亚洲国产日韩一级| 久久久久免费观看| 久久成人精品一区二区三区| 久久精品一区二区三区不卡| 国产日韩欧美一区| 欧美资源在线| 欧美在线黄色| 亚洲高清色综合| 亚洲成色www8888| 久久天堂国产精品| 亚洲激情二区| 国产日韩av在线播放| 午夜精品在线| 羞羞答答国产精品www一本| 国语自产精品视频在线看一大j8| 欧美在线观看日本一区| 久久精品99久久香蕉国产色戒| 狠狠色综合日日| 亚洲人在线视频| 国产精品美腿一区在线看| 久久久久久亚洲综合影院红桃| 欧美一区午夜视频在线观看| 亚洲午夜久久久久久尤物 | 国产精品女人网站| 久久精品亚洲热| 农村妇女精品| 久久av一区二区三区| 欧美高清视频一区| 久久精品99久久香蕉国产色戒 | 久久精品国产精品亚洲精品| 亚洲激情视频在线播放| 中文久久乱码一区二区| 在线观看视频一区| 亚洲午夜激情| 亚洲国产精品视频一区| 亚洲自拍偷拍色片视频| 一区在线免费| 亚洲免费在线观看| 亚洲私人影院| 免费h精品视频在线播放| 午夜欧美精品久久久久久久| 欧美成人中文字幕| 亚洲大胆人体视频| 国产精品丝袜久久久久久app| 亚洲精一区二区三区| 亚洲三级电影全部在线观看高清| 亚洲一本大道在线| 亚洲综合色激情五月| 欧美日韩人人澡狠狠躁视频| 欧美激情1区2区3区| 亚洲国产一区二区在线| 欧美高清hd18日本| 亚洲国产一区二区三区青草影视| 久久精品首页| 校园激情久久| 国产精品高潮呻吟久久| 欧美激情第六页| 在线视频欧美精品| 国产日韩欧美a| 久久成人精品无人区| 欧美不卡视频一区发布| 亚洲九九精品| 国产精品无码专区在线观看| 欧美在线观看天堂一区二区三区| 久久综合色影院| 日韩一级大片在线| 国产日本欧美一区二区| 久久精品国产91精品亚洲| 免费欧美电影| 亚洲一级特黄| 亚洲电影免费在线观看| 欧美三级在线视频| 久久精品日韩欧美| 一区二区欧美激情| 欧美电影资源| 久久久久久久精| 亚洲一区二区三区三| 亚洲人精品午夜| 国产一区二区三区四区在线观看| 欧美99在线视频观看| 先锋亚洲精品| 亚洲素人在线| 一区二区三区三区在线| 亚洲国产精品久久久久婷婷老年 | 麻豆91精品| 久久精品女人| 开心色5月久久精品| 欧美不卡激情三级在线观看| 欧美96在线丨欧| 欧美日韩伦理在线免费| 国产精品区一区| 一色屋精品视频在线看| 欧美日韩国产成人精品| 午夜精品免费| 亚洲欧洲精品天堂一级|