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

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>
            欧美一级久久久| 中文国产一区| 欧美www视频在线观看| 亚洲日本va午夜在线影院| 久久久免费精品视频| 99国产精品国产精品久久| 在线综合视频| 伊人狠狠色j香婷婷综合| 亚洲国产一成人久久精品| 欧美午夜精品久久久久久浪潮| 欧美伊人久久| 欧美激情综合在线| 久久久免费av| 欧美特黄一级| 欧美激情精品久久久久久变态| 国产精品老牛| 亚洲电影毛片| 国产一区二区视频在线观看| 亚洲乱码国产乱码精品精可以看| 狠狠爱成人网| 亚洲在线电影| 一本色道久久99精品综合| 久久久av毛片精品| 欧美亚洲三区| 亚洲国产精品久久久久秋霞蜜臀| 亚洲欧美在线免费| 国产真实久久| 欧美在线日韩精品| 老鸭窝91久久精品色噜噜导演| 国产欧美日韩在线视频| 亚洲一区观看| 亚洲一区激情| 欧美剧在线观看| 最新日韩精品| 亚洲视屏在线播放| 一区二区三区日韩精品| 久久精品国产欧美亚洲人人爽| 伊人成综合网伊人222| 性做久久久久久免费观看欧美| 欧美女人交a| 欧美电影在线免费观看网站| 国产亚洲a∨片在线观看| 在线视频你懂得一区 | 亚洲素人一区二区| 欧美成人综合一区| 欧美激情亚洲| 亚洲精品综合| 欧美成人免费va影院高清| 美女福利精品视频| 在线观看精品| 免费在线国产精品| 亚洲国产精品日韩| 亚洲精品日本| 欧美日韩成人综合在线一区二区| 亚洲人成77777在线观看网| 亚洲另类一区二区| 欧美日韩国产免费| 中文精品视频| 欧美在线1区| 狠狠色狠色综合曰曰| 久久裸体艺术| 亚洲国产综合在线| 国产精品99久久久久久白浆小说| 欧美日韩视频第一区| 一区二区三区视频免费在线观看| 亚洲欧美另类综合偷拍| 国产日产欧美精品| 久久偷看各类wc女厕嘘嘘偷窃| 欧美福利电影网| 一区二区三区.www| 国产伦理一区| 另类人畜视频在线| 日韩视频免费观看| 欧美在线观看一区| 狠狠综合久久av一区二区小说| 你懂的视频欧美| 中文欧美日韩| 久久综合激情| 99精品欧美一区二区三区综合在线| 国产精品va在线播放| 久久成年人视频| 最新成人av在线| 午夜一区在线| 亚洲片国产一区一级在线观看| 国产精品久久二区| 久久综合久久综合这里只有精品 | 国产精品一区在线观看你懂的| 欧美一站二站| 亚洲三级国产| 久久久噜噜噜久久久| av成人天堂| 激情久久中文字幕| 欧美色图一区二区三区| 久久精品30| 在线亚洲一区观看| 麻豆91精品| 在线视频精品一区| 国产一区二区三区的电影| 欧美激情在线有限公司| 香港久久久电影| 亚洲精品在线观看免费| 乱中年女人伦av一区二区| 亚洲欧美中文日韩在线| 亚洲精品久久久久久久久| 国产日韩久久| 国产精品成人在线| 欧美激情视频给我| 久久一区中文字幕| 欧美一区=区| 亚洲一区二区免费视频| 亚洲成人在线视频播放 | 久久久国产精品亚洲一区| 一本色道久久88精品综合| 欧美激情国产日韩| 免费一级欧美片在线播放| 欧美一区二区在线免费观看| 一本久久a久久精品亚洲| 亚洲电影毛片| 国模叶桐国产精品一区| 国产毛片一区二区| 欧美色欧美亚洲高清在线视频| 你懂的视频欧美| 久久人人97超碰国产公开结果| 午夜精品在线观看| 亚洲一区日本| 亚洲一区精彩视频| 一本在线高清不卡dvd | 国产精品久久久久久久浪潮网站 | 欧美日韩一本到| 91久久精品国产91性色| 美女啪啪无遮挡免费久久网站| 久久婷婷影院| 久久国产精品99精品国产| 久久精品一区二区三区不卡牛牛| 在线观看视频免费一区二区三区| 亚洲另类黄色| 最新热久久免费视频| 亚洲欧美亚洲| 亚洲欧洲三级| 国产精品美女久久久免费| 亚洲东热激情| 亚洲午夜视频在线观看| 国产一区二区三区四区hd| 亚洲第一搞黄网站| 亚洲一区激情| 99在线精品观看| 美女黄毛**国产精品啪啪| 欧美在线观看网站| 久久精品国产亚洲aⅴ| 欧美人成在线| 欧美成人免费网站| 欧美国产欧美综合 | 亚洲黄色在线看| 亚洲黄色高清| 一区二区精品在线| 国产婷婷色一区二区三区| 欧美国产先锋| 亚洲精品乱码久久久久| 欧美ab在线视频| 亚洲三级免费| 国产性天天综合网| 亚洲综合丁香| 欧美 日韩 国产 一区| 黄色欧美成人| 久久综合狠狠综合久久激情| 老牛嫩草一区二区三区日本 | 国产视频亚洲| 黄色成人精品网站| 亚洲国产精品一区二区尤物区 | 久久精品免费看| 欧美成人黑人xx视频免费观看| 欧美日韩中文字幕在线| 国产色爱av资源综合区| 亚洲高清一二三区| 亚洲永久字幕| 蜜桃久久精品一区二区| 亚洲精品欧美| 亚洲一区二区三区色| 久久免费一区| 国产精品超碰97尤物18| 有码中文亚洲精品| 亚洲——在线| 欧美岛国激情| 亚洲欧美日本日韩| 欧美精品电影在线| 韩日精品在线| 午夜精品久久久久久久久久久| 欧美成人精品在线| 亚洲综合国产| 欧美激情亚洲国产| 国产一区二区你懂的| 亚洲一区二区三区欧美| 欧美粗暴jizz性欧美20| 亚洲欧美一区二区三区在线| 欧美激情在线有限公司| 影音先锋久久资源网| 亚洲欧美日韩人成在线播放| 欧美激情中文字幕一区二区| 性欧美大战久久久久久久免费观看 | 好吊色欧美一区二区三区视频|