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

posts - 16,  comments - 34,  trackbacks - 0

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

問題見: http://bbs2.chinaunix.net/viewthread.php?tid=1373280

 

問題描述

 

問題解答

 


 

問題分析

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

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

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

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



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


 

常見應(yīng)用

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

例1,Loki::ScopeGuard

Loki::ScopeGuard

 

Loki::ScopeGuard MACRO 示例


 1// Loki::ScopeGuard macro sample
 2// Loki::ScopeGuard : 范型、輕量的RAII技術(shù) ,對資源管理與異常安全提供非常強(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個名字以scopeGuard為前綴文件行號為后綴的“變量”(名字就不會重復(fù))。
它們在退出作用域的時候會分別調(diào)用:fclose(input); fclose(output);
PS:ScopeGuard的強(qiáng)大還不僅僅體現(xiàn)在這里,以后會專門介紹。


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

make label



例2.2,做鍵盤模擬的時候,按照i8042的規(guī)則,每次寫入端口時,需要等待輸入緩沖為空。
所以需要實(shí)現(xiàn)一個 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)備寫入數(shù)據(jù)
    KBC_Wait4IBE(); // error C2045: 'KBC_WAIT4IBE_label' : label redefined
    // 標(biāo)號重復(fù)
}


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


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


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

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

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



 

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


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

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

FeedBack:
# re: 使用宏作宏參數(shù)
2009-02-19 09:25 | 飄雪
好文,我原來對這個問題也想了很久  回復(fù)  更多評論
  
# re: 使用宏作宏參數(shù)
2009-02-19 09:52 | 路青飛
我可不可理解為,宏中宏!
哈哈!好文!贊一個!  回復(fù)  更多評論
  
# re: 使用宏作宏參數(shù)
2009-02-19 11:50 |
不錯,終于明白這個問題了!當(dāng)初困擾我很久,還是沒有解決的問題!哈哈  回復(fù)  更多評論
  
# 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ù)  更多評論
  
# 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ù)  更多評論
  
# 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ù)  更多評論
  
<2025年9月>
31123456
78910111213
14151617181920
21222324252627
2829301234
567891011

常用鏈接

留言簿(8)

隨筆檔案(16)

鏈接

搜索

  •  

積分與排名

  • 積分 - 198759
  • 排名 - 134

最新隨筆

最新評論

閱讀排行榜

評論排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            国内外成人免费激情在线视频网站 | 欧美成人免费全部| 久久久噜噜噜久久人人看| 欧美日本一道本| 亚洲精品三级| 久久久久久久久久看片| 中文国产成人精品久久一| 欧美精品一区二区三区蜜臀| 亚洲欧洲日本mm| 亚洲激情电影在线| 午夜精品久久久久久久久久久久 | 亚洲一区二区三区免费在线观看| 久久爱www久久做| 亚洲免费网站| 国产欧美视频一区二区| 欧美在线视频二区| 99国产成+人+综合+亚洲欧美| 欧美国内亚洲| 亚洲图片在线| 亚洲在线第一页| 国产在线拍偷自揄拍精品| 亚洲国产成人精品女人久久久| 欧美在线视频一区二区| 欧美影院精品一区| 亚洲成在线观看| 亚洲日本电影在线| 国产女主播一区二区| 欧美福利在线观看| 国产精品中文字幕欧美| 亚洲大片在线| 国产精品网站在线观看| 欧美激情欧美激情在线五月| 国产精品乱码一区二区三区| 欧美激情一区二区三区在线| 国产欧美一区二区视频| 亚洲精品欧美日韩| 在线成人h网| 亚洲在线免费视频| 亚洲精品视频在线播放| 久久国产精品久久精品国产| 亚洲午夜精品在线| 欧美99在线视频观看| 久久婷婷麻豆| 国产三级欧美三级日产三级99| 欧美成人按摩| 毛片精品免费在线观看| 午夜精品久久久久久久久久久| 一区二区福利| 日韩视频一区二区三区| 久久久噜噜噜久久中文字幕色伊伊| 亚洲免费视频成人| 欧美精品免费播放| 亚洲成人在线视频播放| 国产一区亚洲一区| 亚洲欧美国产精品专区久久| 亚洲视频福利| 欧美激情区在线播放| 鲁大师成人一区二区三区| 国产农村妇女精品| 亚洲免费在线观看视频| 亚洲欧美日韩综合aⅴ视频| 欧美另类女人| 99国产精品久久久久老师| 日韩午夜精品视频| 欧美激情亚洲国产| 亚洲精品一区二区在线观看| 日韩午夜视频在线观看| 欧美国产一区二区三区激情无套| 欧美ed2k| 亚洲精品日产精品乱码不卡| 欧美激情久久久久久| 亚洲人成人99网站| 亚洲美女一区| 欧美无砖砖区免费| 午夜精品一区二区三区在线播放| 欧美一级午夜免费电影| 国产日韩欧美麻豆| 久久久久9999亚洲精品| 亚洲电影免费观看高清完整版| 亚洲国产天堂久久综合网| 久久电影一区| 亚洲国产三级在线| 亚洲欧美日本伦理| 国产一区二区精品久久91| 久久精品免费看| 亚洲国产日韩一区二区| 亚洲视频综合在线| 国产视频欧美视频| 鲁大师影院一区二区三区| 亚洲免费成人| 久久久久九九九九| 亚洲激情在线播放| 欧美特黄a级高清免费大片a级| 午夜国产精品视频免费体验区| 久久精品国产视频| 亚洲精品免费网站| 国产精品高潮呻吟| 麻豆精品在线播放| 国产精品99久久不卡二区| 久久综合久久88| 亚洲一二三四久久| 精品成人久久| 国产精品二区在线| 女生裸体视频一区二区三区| 亚洲特色特黄| 亚洲高清成人| 久久精品男女| 宅男噜噜噜66国产日韩在线观看| 国产一区二区三区日韩欧美| 欧美日韩成人综合天天影院| 欧美尤物一区| 一区二区三区日韩精品视频| 久久亚洲综合色一区二区三区| 亚洲精品一区二区三区99| 欧美一区二区三区播放老司机| 亚洲第一成人在线| 欧美成人精品| 欧美精品一区二区三区久久久竹菊| 香蕉久久精品日日躁夜夜躁| 99精品免费视频| 欧美国产91| 快射av在线播放一区| 亚洲自拍都市欧美小说| 亚洲精品国产拍免费91在线| 国产一区二区三区四区| 国产精品老女人精品视频| 欧美日韩91| 欧美成人亚洲成人| 牛牛影视久久网| 久久天天躁狠狠躁夜夜爽蜜月 | 亚洲一区综合| 亚洲天堂av综合网| 一本色道久久综合亚洲精品不卡| 亚洲福利视频一区二区| 在线观看欧美黄色| 在线观看一区| 亚洲国产91精品在线观看| 伊人久久大香线| 国产一区日韩二区欧美三区| 国产欧美日韩综合一区在线观看| 国产精品嫩草99av在线| 国产精品视频免费| 国产精品亚洲аv天堂网| 国产精品亚洲综合天堂夜夜| 欧美性片在线观看| 国产精品美女主播在线观看纯欲| 欧美午夜在线一二页| 国产精品爱啪在线线免费观看| 欧美区一区二区三区| 欧美日韩福利| 欧美日韩亚洲国产一区| 欧美日韩综合| 国产欧美日韩中文字幕在线| 国产一区二区三区黄| 久久精品国产第一区二区三区最新章节| 狠狠色丁香婷婷综合| 在线观看91精品国产入口| 狠狠88综合久久久久综合网| 亚洲国产合集| 中文在线一区| 久久不射中文字幕| 美女爽到呻吟久久久久| 亚洲福利视频三区| 一级成人国产| 欧美一区二区三区视频| 久久在线播放| 欧美性猛交一区二区三区精品| 国产午夜精品久久久久久免费视| 在线观看欧美精品| 亚洲私人影院| 久久精品日产第一区二区| 欧美第十八页| 国产精品99久久久久久久久久久久 | 亚洲激情视频网站| 亚洲天堂视频在线观看| 久久精品免费观看| 欧美日韩精品免费观看视一区二区 | 国产亚洲精品久久飘花| 最近中文字幕mv在线一区二区三区四区| 一区二区三区免费看| 久久精品国产精品亚洲| 亚洲激情不卡| 先锋影音久久久| 欧美日韩大片| 一本久久综合亚洲鲁鲁| 噜噜噜噜噜久久久久久91| 亚洲欧美日韩在线一区| 蜜乳av另类精品一区二区| 亚洲精品在线观| 久久久噜久噜久久综合| 国产精品v欧美精品v日本精品动漫| 国模一区二区三区| 亚洲在线不卡| 亚洲激情不卡| 久久午夜视频| 国产日韩欧美在线播放| 中国女人久久久| 亚洲第一综合天堂另类专| 欧美一站二站| 国产精品一二三四区|