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

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)確!!!
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 閱讀(3499) 評論(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ù)  更多評論
  

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


<2025年9月>
31123456
78910111213
14151617181920
21222324252627
2829301234
567891011

常用鏈接

留言簿(8)

隨筆檔案(16)

鏈接

搜索

  •  

積分與排名

  • 積分 - 198741
  • 排名 - 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>
            久久香蕉精品| 久久久久网址| 国产精品久久一区主播| 亚洲一区二区网站| 亚洲欧美视频一区| 尤物精品在线| 日韩特黄影片| 国产欧美一区二区精品婷婷| 久久亚洲综合色| 欧美精品国产一区二区| 香蕉久久一区二区不卡无毒影院 | 亚洲一区在线看| 亚洲在线国产日韩欧美| 伊甸园精品99久久久久久| 亚洲电影在线| 国产精品日日摸夜夜添夜夜av| 久久久精品网| 欧美看片网站| 久久这里只有| 国产精品成人午夜| 欧美激情亚洲激情| 国产精品视频久久久| 欧美成人免费va影院高清| 欧美视频网址| 欧美第一黄网免费网站| 国产精品大片| 亚洲第一精品久久忘忧草社区| 国产精品久久一区二区三区| 欧美不卡一区| 国产一区二区三区在线观看精品| 亚洲黄色免费| 在线观看一区视频| 亚洲欧美国产精品va在线观看| 校园春色综合网| 一区二区冒白浆视频| 久久精品一区二区三区四区| 午夜精品久久久| 欧美精品一区三区在线观看| 欧美va日韩va| 国产一级一区二区| 亚洲综合成人在线| 一区二区三区国产在线| 欧美jjzz| 欧美激情一区二区三级高清视频 | 欧美视频一区| 亚洲日本成人| 亚洲欧洲日韩综合二区| 先锋资源久久| 欧美在线亚洲在线| 国产精品蜜臀在线观看| 一区二区黄色| 亚洲一区二区在线播放| 欧美日韩亚洲一区二| 亚洲黄页一区| 一区二区精品在线| 欧美国产亚洲视频| 亚洲国产三级在线| 亚洲精品色婷婷福利天堂| 欧美大学生性色视频| 欧美电影电视剧在线观看| 亚洲国产精品悠悠久久琪琪| 久久躁日日躁aaaaxxxx| 欧美激情第4页| 亚洲精品一区在线观看香蕉| 欧美激情精品久久久久久久变态| 亚洲国产高清一区| 亚洲人成在线观看网站高清| 欧美国产日韩视频| 一本色道久久综合亚洲精品小说| 亚洲天堂av综合网| 国产精品亚洲综合久久| 欧美在线91| 欧美成人一二三| 99re6这里只有精品| 欧美日韩国产精品一区二区亚洲| 99精品欧美一区二区蜜桃免费| 亚洲午夜成aⅴ人片| 国产精自产拍久久久久久蜜| 久久精品亚洲精品| 亚洲三级视频| 性色av一区二区三区| 激情久久婷婷| 欧美裸体一区二区三区| 亚洲天堂成人在线观看| 久久久久久999| 亚洲激情成人网| 欧美视频在线一区| 久久大逼视频| 亚洲精品中文字| 欧美一区二区三区男人的天堂| 狠狠色狠色综合曰曰| 欧美激情一区二区三区全黄| 亚洲综合电影一区二区三区| 免费成人高清在线视频| 麻豆九一精品爱看视频在线观看免费| 亚洲激情成人| 久久亚洲春色中文字幕久久久| 亚洲精品色婷婷福利天堂| 国产精品亚洲人在线观看| 欧美成人嫩草网站| 午夜精品亚洲| 999亚洲国产精| 老司机精品视频网站| 亚洲视频免费在线| 红桃视频一区| 国产精品爽爽爽| 欧美精品久久天天躁| 久久成人国产精品| 亚洲小说欧美另类社区| 亚洲国产精品久久91精品| 久久九九免费视频| 亚洲女人天堂成人av在线| 黄色在线成人| 国产亚洲欧美日韩精品| 国产精品电影在线观看| 欧美激情第10页| 久久亚洲精选| 欧美一级网站| 亚洲欧美清纯在线制服| 日韩午夜在线视频| 亚洲激情国产| 欧美激情国产日韩| 美女黄毛**国产精品啪啪| 欧美一区二区三区四区在线观看地址| av不卡在线看| 日韩视频欧美视频| 亚洲人成人一区二区三区| 在线播放亚洲一区| 伊人影院久久| 激情久久影院| 狠狠色综合色综合网络| 国产专区一区| 国产亚洲一区二区三区| 国产欧美亚洲日本| 国产日韩精品一区观看 | 欧美成人首页| 欧美粗暴jizz性欧美20| 蜜桃av综合| 欧美成人久久| 欧美不卡视频一区| 欧美成人午夜视频| 欧美激情免费观看| 欧美日韩成人综合| 国产精品高精视频免费| 国产精品国产三级国产普通话三级 | 久久精品在线观看| 久久亚洲综合网| 久久免费高清视频| 美女成人午夜| 欧美日韩精品一区二区天天拍小说 | 亚洲综合成人在线| 久久精品欧美日韩| 欧美jizz19性欧美| 欧美日韩在线一区二区三区| 国产精品久久久免费| 国产精品永久入口久久久| 国产午夜一区二区三区| 亚洲第一视频网站| 亚洲精品国产精品久久清纯直播| 日韩一级免费观看| 校园春色国产精品| 免费成人美女女| 亚洲美女视频网| 午夜视频在线观看一区二区三区 | 日韩系列欧美系列| 欧美一区二区在线播放| 免费观看日韩| 国产精品wwwwww| 伊人婷婷欧美激情| 亚洲天堂久久| 久久色中文字幕| 亚洲精品一区二区三区樱花 | 亚洲一区二区三区中文字幕在线| 欧美专区在线| 欧美色欧美亚洲另类二区| 国产日韩欧美综合精品| 亚洲精品一区二区在线| 午夜亚洲视频| 亚洲国产精品99久久久久久久久| 一区二区av在线| 麻豆精品网站| 国产一区二区电影在线观看 | 亚洲国产精品第一区二区三区| 亚洲图片欧洲图片日韩av| 久色成人在线| 亚洲专区欧美专区| 欧美区视频在线观看| 激情欧美一区二区| 午夜日韩在线| 亚洲精一区二区三区| 久久久久一本一区二区青青蜜月| 国产精品成人一区二区网站软件 | 欧美成人有码| 激情五月***国产精品| 亚洲一区二区三区四区视频| 亚洲成人在线视频播放| 欧美中文字幕视频在线观看| 国产精品每日更新| 一区二区三区高清不卡| 亚洲国产高清视频|