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

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://m.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>
            亚洲一区二区三区高清| 亚洲欧美成人在线| 亚洲一区二区精品在线观看| 亚洲国产成人porn| 尤妮丝一区二区裸体视频| 国产一区二区三区不卡在线观看| 欧美视频福利| 国产欧美日韩一区二区三区在线观看| 欧美日韩美女在线| 国产精品久久一区主播| 国产婷婷97碰碰久久人人蜜臀| 国产精品女主播一区二区三区| 欧美午夜电影在线| 国产亚洲一区二区三区在线播放| 国产亚洲欧美一区在线观看| 一区二区在线视频| 性色av香蕉一区二区| 亚洲免费一级电影| 裸体一区二区| 国产精品一区免费在线观看| 伊人精品成人久久综合软件| 日韩午夜在线| 蜜桃伊人久久| 亚洲永久免费| 欧美日韩美女一区二区| 亚洲片国产一区一级在线观看| 亚洲伊人久久综合| 亚洲电影网站| 久久青草久久| 国产精品成人观看视频国产奇米| 亚洲高清资源| 欧美福利电影在线观看| 久久不见久久见免费视频1| 国产精品高清网站| 亚洲一区二区成人| 亚洲综合99| 国产精品入口66mio| 午夜精品福利在线| 亚洲欧美日韩一区二区三区在线| 欧美性做爰毛片| 亚洲欧美一区二区三区久久| 艳女tv在线观看国产一区| 国产精品毛片大码女人| 欧美一区二区免费观在线| 亚洲欧美在线另类| 国产亚洲视频在线| 亚洲国产裸拍裸体视频在线观看乱了中文 | 久久免费视频观看| 久久精品欧美| 久久久亚洲国产天美传媒修理工| 香蕉亚洲视频| 亚洲高清免费视频| 亚洲欧洲日产国码二区| 欧美三级午夜理伦三级中视频| 亚洲午夜在线| 麻豆成人在线| 久久精品视频亚洲| 欧美精品一区二区三区四区| 亚洲一区二区黄| 另类人畜视频在线| 欧美影院在线| 欧美日韩一区免费| 欧美成人中文字幕在线| 国产精品美女久久久浪潮软件 | 亚洲天堂av在线免费观看| 亚洲一区二区三区中文字幕| 亚洲激情在线观看| 久久精品最新地址| 久久精品日韩欧美| 欧美午夜精品一区二区三区| 欧美国产一区二区在线观看| 国内精品久久久久伊人av| 一本色道久久99精品综合| 亚洲精品欧美日韩| 欧美11—12娇小xxxx| 亚洲伦理自拍| 久久综合影视| 亚洲黄网站在线观看| 亚洲三级视频在线观看| 欧美高清在线视频观看不卡| 欧美a级大片| 夜夜夜久久久| 一区二区三区精密机械公司| 一本色道久久加勒比88综合| 欧美精品一区二区三区视频 | 亚洲狠狠丁香婷婷综合久久久| 香蕉久久一区二区不卡无毒影院| 午夜国产精品视频| 好吊视频一区二区三区四区 | 久久久久久穴| 亚洲精品中文字| 欧美在线观看你懂的| 最新亚洲电影| 国产欧美综合在线| 欧美大片91| 久久精品国产精品亚洲| 99国产精品国产精品久久| 久久九九热免费视频| 日韩午夜一区| 在线观看三级视频欧美| 国产精品卡一卡二卡三| 免费人成网站在线观看欧美高清| 午夜欧美大片免费观看| 日韩视频在线免费| 亚洲第一网站| 欧美成人午夜| 久久婷婷国产综合尤物精品| 亚洲永久在线| 一区二区三区欧美成人| 亚洲日本免费| 亚洲黄网站在线观看| 亚洲第一中文字幕| 亚洲福利视频网| 亚洲国产精品福利| 91久久在线播放| 亚洲美女中文字幕| 一本久久综合亚洲鲁鲁| 一本色道久久综合亚洲精品不| 久久色在线观看| 久久久www成人免费精品| 久久久久久久一区| 久久综合狠狠| 欧美精品在线免费观看| 欧美视频在线播放| 国产主播一区二区| 亚洲日本在线视频观看| 日韩视频精品在线观看| 亚洲午夜精品一区二区| 欧美有码在线视频| 欧美大成色www永久网站婷| 亚洲精品国产日韩| 中文在线不卡视频| 久久人人爽爽爽人久久久| 欧美日本国产| 激情六月婷婷久久| 亚洲一区二区精品在线观看| 久久最新视频| 亚洲私拍自拍| 欧美精彩视频一区二区三区| 国产亚洲精品久久飘花 | 黄色日韩在线| 亚洲免费视频观看| 亚洲精品你懂的| 欧美资源在线| 国产精品视频网址| 日韩视频专区| 欧美激情一二三区| 久久欧美中文字幕| 亚洲高清久久网| 欧美.日韩.国产.一区.二区| 欧美一区二区三区啪啪| 国产日韩欧美视频| 久久午夜影视| 久久亚洲私人国产精品va| 国内自拍视频一区二区三区| 欧美在线你懂的| 欧美一区2区视频在线观看 | 欧美激情视频一区二区三区不卡| 欧美一级理论性理论a| 欧美日韩在线视频首页| 亚洲一卡二卡三卡四卡五卡| 一区二区激情小说| 国产精品乱码一区二三区小蝌蚪| 亚洲一区自拍| 久久久久免费观看| 99视频精品在线| 亚洲欧美国产精品va在线观看| 国产日韩精品在线播放| 免费欧美日韩国产三级电影| 欧美精品一区二区三区视频 | 日韩视频在线一区二区三区| 亚洲国产高清在线观看视频| 欧美理论在线播放| 久久久亚洲欧洲日产国码αv| 麻豆av一区二区三区久久| 亚洲视频1区2区| 久久久噜噜噜久久| 性xx色xx综合久久久xx| 欧美刺激性大交免费视频| 久久精品日产第一区二区三区| 欧美精品一区二区三区久久久竹菊 | 性伦欧美刺激片在线观看| 亚洲激情社区| 欧美一区二区视频97| 亚洲免费一级电影| 欧美日韩一区三区四区| 亚洲国产日韩在线| 亚洲激情在线视频| 久久精品一区二区国产| 久久精品国产欧美亚洲人人爽| 欧美日韩在线播放一区| 亚洲黄色在线视频| 夜夜狂射影院欧美极品| 欧美人妖另类| 一区二区精品在线观看| 亚洲小视频在线观看| 日韩午夜在线观看视频| 亚洲日本一区二区三区| 免费亚洲电影| 日韩网站在线看片你懂的|