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

posts - 16,  comments - 34,  trackbacks - 0

題目有點繞口……

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

 

問題描述

 

問題解答

 


 

問題分析

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

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

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

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



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


 

常見應用

根據行號命名——為了取一些相互不沖突的名字,使用行號作為后綴。
因為__LINE__也是一個,所以需要這種方法。

例1,Loki::ScopeGuard

Loki::ScopeGuard

 

Loki::ScopeGuard MACRO 示例


 1// Loki::ScopeGuard macro sample
 2// Loki::ScopeGuard : 范型、輕量的RAII技術 ,對資源管理與異常安全提供非常強大的支持
 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行,根據loki/ScopeGuard.h (658)中的定義,將被分別替換成:

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

也就是定義2個名字以scopeGuard為前綴文件行號為后綴的“變量”(名字就不會重復)。
它們在退出作用域的時候會分別調用:fclose(input); fclose(output);
PS:ScopeGuard的強大還不僅僅體現在這里,以后會專門介紹。


例2.1,內嵌匯編或者使用goto時,需要一個不重復的跳轉標號。

make label



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



但是又不想有函數調用消耗,所以打算用宏實現。
實驗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); // 準備寫入數據
    KBC_Wait4IBE(); // error C2045: 'KBC_WAIT4IBE_label' : label redefined
    // 標號重復
}


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


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


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

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

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



 

再補充一點: 關于于宏的調試。
在MSVC下,可以給某個編譯單元xxx.c(cpp,cxx)加入"/P"(不含引號,P一定大寫)命令。
編譯該單元后,會在xxx.c的同目錄下生成xxx.i,即預處理的結果。
在GCC下,可以使用 gcc(g++) -E xxx.c(cpp,cxx) (必要時還需要 -i ),查看預處理結果。



再次補充!

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


沒能搜到ANSI C標準的文檔……

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

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

只有注冊用戶登錄后才能發表評論。
網站導航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


<2025年12月>
30123456
78910111213
14151617181920
21222324252627
28293031123
45678910

常用鏈接

留言簿(8)

隨筆檔案(16)

鏈接

搜索

  •  

積分與排名

  • 積分 - 199137
  • 排名 - 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久久精品芒果| 一区二区三区精密机械公司 | 国产视频一区三区| 136国产福利精品导航网址应用 | 国产欧美日韩精品丝袜高跟鞋| 在线观看精品一区| 亚洲午夜久久久| 欧美成人午夜激情| 亚洲免费一级电影| 欧美片在线观看| 在线不卡免费欧美| 亚洲成色www8888| 午夜精品福利在线| 亚洲国产婷婷| 久久美女性网| 国产亚洲欧美另类中文| 亚洲在线电影| 99精品99久久久久久宅男| 久久久亚洲欧洲日产国码αv| 国产精品欧美久久| 亚洲成在人线av| 亚洲精品一区中文| 欧美日本不卡视频| 久久精品国产亚洲一区二区| 亚洲一本大道在线| 国产精品黄色在线观看| 亚洲天堂视频在线观看| 亚洲人成在线影院| 日韩天堂av| 伊人久久亚洲美女图片| 欧美性开放视频| 国内精品一区二区三区| 亚洲欧洲av一区二区三区久久| 欧美在线高清| 亚洲无毛电影| 美国十次了思思久久精品导航| 国产日本亚洲高清| 亚洲国产欧美另类丝袜| 国产亚洲精品资源在线26u| 亚洲人成在线播放| 尤物精品在线| 性久久久久久久久久久久| 国产亚洲毛片| 国产精品99久久不卡二区| 国产伦精品一区二区三| 久久久国产一区二区三区| 欧美日本韩国一区二区三区| 久久综合综合久久综合| 久久天天躁狠狠躁夜夜av| 欧美一级电影久久| 久久久另类综合| 欧美一区二粉嫩精品国产一线天| 午夜日韩在线| 亚洲男女自偷自拍图片另类| 欧美一区二区在线看| 亚洲国产婷婷综合在线精品| 亚洲精品国产精品久久清纯直播 | 亚洲一区国产视频| 韩日精品视频| 亚洲精品乱码久久久久久蜜桃麻豆| 国内成人在线| 欧美一区二区在线免费观看| 欧美在线观看网站| 国产伦精品一区二区三区| 亚洲手机视频| 亚洲女同性videos| 国产精品视频一| 亚洲欧美另类在线| 欧美一区二区性| 国产色爱av资源综合区| 欧美一区二区三区视频在线| 久久久99国产精品免费| 国产亚洲精品久久久久动| 欧美中文字幕精品| 久久综合电影| 国产精品qvod| 亚洲手机成人高清视频| 欧美在线视频播放| 欧美日韩成人免费| 久久综合九色综合欧美狠狠| 狠狠色伊人亚洲综合成人| 久久影院亚洲| 久久久久国产精品麻豆ai换脸| 国产真实精品久久二三区| 久久九九热免费视频| 欧美有码在线视频| 韩国女主播一区| 欧美成人综合网站| 麻豆成人精品| 日韩一级视频免费观看在线| 欧美日韩国语| 小黄鸭视频精品导航| 你懂的亚洲视频| 狠狠综合久久| 欧美激情一区二区三区全黄| 亚洲丶国产丶欧美一区二区三区 | 欧美视频日韩视频在线观看| 美国成人毛片| 国产免费成人av| 久久亚洲综合色| 日韩亚洲视频| 一本久道久久久| 欧美精品黄色| 欧美一区二视频在线免费观看| 葵司免费一区二区三区四区五区| 99在线观看免费视频精品观看| 国产伦精品一区二区三区视频孕妇| 久久久久高清| 亚洲一区精品视频| 欧美国产一区二区三区激情无套| 在线观看日韩av电影| 欧美日韩一级片在线观看| 亚洲美女一区| 老色批av在线精品| 亚洲自拍偷拍麻豆| 日韩图片一区| 伊人成人开心激情综合网| 国产精品成人aaaaa网站| 久久久精品999| 亚洲尤物视频网| 亚洲毛片一区二区| 欧美激情一区在线| 免费在线成人av| 久久精品99国产精品酒店日本| 一区二区三区日韩| 亚洲国产精品久久久久婷婷884| 欧美国产成人精品| 一本一本久久a久久精品综合麻豆| 亚洲一区二区精品视频| 亚洲经典一区| 亚洲成人在线| 在线日韩电影| 一色屋精品视频在线看 | 久久人人爽人人爽| 欧美一区2区三区4区公司二百| 一区二区三欧美| 夜色激情一区二区| 亚洲第一页在线| 亚洲第一精品夜夜躁人人躁 | 9色porny自拍视频一区二区| 激情久久综艺| 欧美高清视频在线播放| 久久午夜色播影院免费高清| 久久精品123| 日韩性生活视频| 亚洲精品美女在线观看| 亚洲国产专区| 亚洲欧洲日产国产网站| 久久精品成人| 久久久视频精品| 国产精品99久久不卡二区 | 国产亚洲成年网址在线观看| 国产欧美一区二区精品婷婷| 国产精品人人做人人爽人人添| 国产精品日本精品| 国产美女精品一区二区三区| 国产亚洲一本大道中文在线| 国产一区二区三区最好精华液| 狠狠色伊人亚洲综合成人| 在线观看国产日韩| 亚洲精品资源美女情侣酒店| 韩日视频一区| 亚洲激情网站免费观看| 9色精品在线| 午夜精品婷婷| 美日韩免费视频| 亚洲精品国产精品国自产在线| 一区二区三区日韩在线观看| 性色av一区二区三区| 六十路精品视频| 欧美日韩在线三级| 国产在线拍揄自揄视频不卡99| 亚洲盗摄视频| 亚洲尤物在线视频观看| 久久久天天操| 亚洲精品视频在线观看免费| 午夜精品福利电影| 香蕉久久精品日日躁夜夜躁| 久久综合久久美利坚合众国| 欧美伦理一区二区| 国产亚洲综合精品| 亚洲美女中文字幕| 久久精品国产一区二区电影 | 亚洲综合电影一区二区三区| 久久久一区二区三区| 亚洲日本成人| 欧美在线关看| 欧美三区美女| 最新日韩在线视频| 亚洲人成网站精品片在线观看| 亚洲专区国产精品| 欧美黄色精品| 欧美在线观看视频一区二区| 欧美日韩国产一区二区三区| 在线播放中文一区| 欧美伊人久久大香线蕉综合69| 91久久久一线二线三线品牌| 久久国产精彩视频| 国产精品久久久久久一区二区三区|