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

tqsheng

go.....
隨筆 - 366, 文章 - 18, 評論 - 101, 引用 - 0
數據加載中……

define 參數

C99標準之宏定義_可變參數宏_#_##

        在查看Android的log功能代碼的時候發現了如下宏定義:

#define LOGV(...) ((void)LOG(LOG_VERBOSE, LOG_TAG, __VA_ARGS__))

        參考如下鏈接和C99標準編寫測試代碼及輸出測試如下:

 

        鏈接地址:

                 http://topic.csdn.net/u/20090311/22/dada8228-9254-47da-b88a-4895fd83ddde.html

                 http://www.vimer.cn/2010/03/cc%E5%AE%8F%E5%AE%9A%E4%B9%89%E7%9A%84%E5%8F%AF%E5%8F%98%E5%8F%82%E6%95%B0.html

                 http://www.uml.org.cn/c%2B%2B/200902104.asp

                 http://baike.baidu.com/view/1967819.htm?fr=ala0_1

                 http://eelab.tsinghua.edu.cn/book/09-11/856891276060145.html

                 http://blog.csdn.net/chenglian_999/archive/2009/11/04/4765317.aspx

 

        語法解釋:

        在最前強調一點,#和##只有在宏定義中有效,其他地方無效

        #(可以稱之為hash字符,the # operator,#運算符),它的作用就是將它后面的東西轉換成字符串。它的作用可以通過測試代碼中的宏定義的#define LOGD部分注釋掉的代碼和未注釋掉的代碼互換來進行理解。(紅色部分)

        ##的作用是將前后兩部分粘合在一起,例子為

#define HASH_HASH STR(# ## #)
#define HASHTEST ####
//--------notice about the space in #define--------------
#define CONTACT(a, b) STR(a ## b)
#define NOSPACE_CONTACT(a, b) STR(a##b)
#define NEW_CONTACT(a,b) newfun(a HASH_HASH b) //a new token is not ever a ##
#define _NEW_CONTACT(a,b) STR(newfun(a HASH_HASH b))
//-------------------------------------------------

        帶參數的宏定義的測試也是紅色字體部分,參考資料中解釋為:

"..."代表可變參數列表, 如果它不是僅有的參數, 那么它只能出現在參數列表的最后. 調用這樣的函數宏時, 傳遞給它的參數個數要不少于參數列表中參數的個數(多余的參數被丟棄).
通過__VA_ARGS__來替換函數宏中的可變參數列表. 注意__VA_ARGS__只能用于函數宏中參數中包含有"..."的情況.

 

        測試代碼:

#include <stdio.h>

#define STR(s) #s
//#define LOGD(...) printf(#__VA_ARGS__)
#define LOGD(...) printf(__VA_ARGS__)

#define HASH_HASH STR(# ## #)
#define HASHTEST ####
//--------notice about the space in #define--------------
#define CONTACT(a, b) STR(a ## b)
#define NOSPACE_CONTACT(a, b) STR(a##b)
#define NEW_CONTACT(a,b) newfun(a HASH_HASH b) //a new token is not ever a ##
#define _NEW_CONTACT(a,b) STR(newfun(a HASH_HASH b))
//-------------------------------------------------
HASHTEST
HASH_HASH
NEW_CONTACT(I,m)
CONTACT(I,m)
NOSPACE_CONTACT(c,d)
//------------------------------------------------

int main()
{

        LOGD("This is a test for C99 #define!""/r/n");
        LOGD(STR(Test STR defination)"/r/n");
        LOGD(HASH_HASH"/r/n");
        LOGD(CONTACT(I,m)"/r/n");
        LOGD(NOSPACE_CONTACT(c,d)"/r/n");
        LOGD(_NEW_CONTACT(I,m)"/r/n");
        LOGD(STR(NEW_CONTACT(I,m))"/r/n");
        return 0;

}

 

        使用gcc命令:

gcc -E test.c

        展開宏定義得到如下代碼:
HASHTEST
"##"
newfun(I "##" m)
"Im"
"cd"


int main()
{

 printf("This is a test for C99 #define!""/r/n");
 printf("Test STR defination""/r/n");
 printf("##""/r/n");
 printf("Im""/r/n");
 printf("cd""/r/n");
 printf("newfun(I HASH_HASH m)""/r/n");
 printf("NEW_CONTACT(I,m)""/r/n");
 return 0;

}


        屏蔽不規范語法最后編譯執行的結果如下:

This is a test for C99 #define!
Test STR defination
##
Im
cd
newfun(I HASH_HASH m)
NEW_CONTACT(I,m)





一般在調試打印Debug信息的時候, 需要可變參數的宏. 從C99開始可以使編譯器標準支持可變參數宏(variadic macros), 另外GCC也支持可變參數宏, 但是兩種在細節上可能存在區別.
1. __VA_ARGS__
        __VA_ARGS__ 將 "..." 傳遞給宏 . 如
        #define debug(format, ...) fprintf(stderr, format, __VA_ARGS__)

2. GCC的復雜宏
        GCC使用一種不同的語法,從而可以給可變參數一個名字,如同其它參數一樣.
        #define debug(format, args...) fprintf (stderr, format, args)
        這和第一條的宏例子是完全一樣的,但是這么寫可讀性更強并且更容易進行描述.

3. ##__VA_ARGS__
        上面兩個定義的宏,如果出現 debug("A Message")的時候,由于宏展開后有個多余的逗號,所以將導致編譯錯誤.
        為了解決這個問題,CPP 使用一個特殊的"##"操作,格式如下:
        #define debug(format, ...) fprintf (stderr, format, ## __VA_ARGS__)
        這里,如果可變參數被忽略或為空,"##"操作將使預處理器(preprocessor)去除掉它前面的那個逗號.


posted on 2012-03-19 11:28 tqsheng 閱讀(1662) 評論(0)  編輯 收藏 引用


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


青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            欧美午夜精品久久久久久人妖| 另类激情亚洲| 欧美成人精品在线观看| 国产精品一区二区久久久久| 艳女tv在线观看国产一区| 久久天堂成人| 久久久久久夜| 欧美精品九九| 亚洲老板91色精品久久| 亚洲成人资源| 欧美国产日韩一区| 亚洲精品社区| 亚洲日本欧美天堂| 欧美日韩一区二区三| 9i看片成人免费高清| 亚洲毛片在线免费观看| 欧美色道久久88综合亚洲精品| 夜夜嗨av一区二区三区免费区| 最新日韩中文字幕| 久久精品主播| 亚洲国产乱码最新视频| 女主播福利一区| 欧美xx69| 午夜精品一区二区三区四区 | 欧美成人资源网| 亚洲精品久久久久久一区二区| 狂野欧美激情性xxxx欧美| 欧美大片一区二区三区| 一区二区激情小说| 亚洲综合清纯丝袜自拍| 狠狠色狠狠色综合人人| 久久综合给合| 欧美激情2020午夜免费观看| 亚洲综合色丁香婷婷六月图片| 亚洲综合视频一区| 在线日韩欧美| 欧美国产免费| 国产精品久久国产精品99gif| 欧美一区二区三区免费视频| 欧美在线资源| aa成人免费视频| 亚洲一区二区免费| 国产真实乱偷精品视频免| 欧美电影电视剧在线观看| 欧美视频在线一区二区三区| 欧美在线欧美在线| 猫咪成人在线观看| 欧美一区二区三区视频在线 | 日韩一级精品| 午夜精品99久久免费| 亚洲成人在线| 亚洲一区在线观看视频 | 国产色产综合产在线视频| 亚洲免费成人av| 亚洲日本中文字幕| 久久蜜桃精品| 麻豆国产精品777777在线| 国产精品色一区二区三区| 99热这里只有成人精品国产| 日韩视频二区| 欧美大秀在线观看| 欧美高潮视频| 亚洲人成网站在线播| 久久先锋影音av| 欧美不卡视频| 亚洲日本一区二区| 你懂的国产精品| 亚洲高清久久久| 亚洲精品护士| 欧美人成在线视频| 99在线|亚洲一区二区| 一区二区三区四区五区在线 | 亚洲综合日本| 久久精品国产综合精品| 国产日韩欧美视频| 久久九九99视频| 亚洲第一视频| 亚洲视频专区在线| 国产精品美女主播| 亚洲欧美在线另类| 蜜乳av另类精品一区二区| 亚洲国产天堂久久综合| 欧美国产日本高清在线| 一本色道久久综合亚洲精品高清| 亚洲一区二区少妇| 国产精品日本欧美一区二区三区| 亚洲欧美日韩中文视频| 免费视频久久| 99re热这里只有精品免费视频| 欧美午夜精品电影| 午夜视频一区| 欧美国产一区视频在线观看| 夜夜嗨一区二区| 国产乱码精品一区二区三区五月婷| 欧美在线不卡| 亚洲国产一区二区精品专区| 亚洲一区二区免费看| 国产亚洲欧美日韩美女| 农夫在线精品视频免费观看| 在线视频欧美精品| 欧美ed2k| 亚洲男女毛片无遮挡| 狠狠色狠狠色综合人人| 欧美激情综合在线| 午夜精品福利一区二区蜜股av| 欧美大片在线看免费观看| 亚洲一区国产| 亚洲国产精品久久91精品| 欧美日韩国产在线播放网站| 欧美专区日韩专区| 亚洲精品网站在线播放gif| 久久av老司机精品网站导航| 亚洲精品美女在线观看播放| 国产伦精品免费视频| 欧美国产综合视频| 性欧美办公室18xxxxhd| 日韩午夜av| 欧美激情国产高清| 久久av一区二区三区漫画| 9l国产精品久久久久麻豆| 亚洲福利视频三区| 国产伦精品一区二区三区免费迷| 欧美激情免费观看| 久久乐国产精品| 欧美一区二区免费观在线| 亚洲精选大片| 亚洲国产va精品久久久不卡综合| 久久久精彩视频| 欧美一区二区三区免费在线看| 99视频超级精品| 亚洲国产成人精品女人久久久| 国产日韩欧美一区二区三区四区| 欧美日韩国产色视频| 欧美成年人视频| 久久婷婷麻豆| 久久久久一区二区三区| 欧美影视一区| 欧美一级视频精品观看| 亚洲欧美日韩中文播放| 亚洲一区二区欧美日韩| 一区二区日韩精品| 一区二区精品在线| 中文一区在线| 亚洲欧美日韩精品| 午夜久久99| 久久福利毛片| 久久久久久伊人| 久久综合99re88久久爱| 噜噜爱69成人精品| 欧美高清视频www夜色资源网| 欧美电影在线播放| 欧美日韩精品二区| 欧美三区在线视频| 国产精品综合色区在线观看| 国产欧美日韩一区二区三区| 国产一区二区高清不卡| 国产一区二区你懂的| 黄色成人在线网址| 最新高清无码专区| 亚洲网站视频福利| 亚洲欧美激情四射在线日| 久久aⅴ国产欧美74aaa| 美女视频黄 久久| 91久久精品一区二区三区| 艳女tv在线观看国产一区| 亚洲女女女同性video| 久久国产精品色婷婷| 免费永久网站黄欧美| 欧美日韩久久精品| 国产欧美日韩中文字幕在线| 黄色成人在线免费| 一区二区久久| 久久精品国产在热久久| 欧美激情 亚洲a∨综合| 一区二区国产在线观看| 久久国产精品色婷婷| 欧美成人精品不卡视频在线观看| 欧美日韩另类在线| 国产欧美一区二区三区久久| 在线看国产日韩| 亚洲免费人成在线视频观看| 久久不射电影网| 亚洲盗摄视频| 欧美一级久久| 欧美日韩另类字幕中文| 国内精品久久久久久| 亚洲靠逼com| 久久亚洲一区二区三区四区| 亚洲精品免费一区二区三区| 欧美一区二区三区视频| 欧美人成免费网站| 在线免费观看日韩欧美| 午夜精品久久久久久久蜜桃app| 农夫在线精品视频免费观看| 亚洲午夜在线视频| 免费一级欧美在线大片| 国产一区二区三区视频在线观看 | 亚洲成色777777女色窝| 亚洲在线视频| 亚洲日本欧美在线|