<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 寫(xiě)出高效優(yōu)美的單片機(jī)C語(yǔ)言代碼

          寫(xiě)出高效優(yōu)美的單片機(jī)C語(yǔ)言代碼

          作者: 時(shí)間:2013-07-01 來(lái)源:網(wǎng)絡(luò) 收藏

          這行會(huì)被展開(kāi)為:

          printf("int max: %sn", "INT_MAX");

          printf("%sn", CONS(A, A)); // compile error

          這一行則是:

          printf("%sn", int(AeA));

          INT_MAX和A都不會(huì)再被展開(kāi), 然而解決這個(gè)問(wèn)題的方法很簡(jiǎn)單. 加多一層中間轉(zhuǎn)換宏. 加這層宏的用意是把所有宏的參數(shù)在這層里全部展開(kāi), 那么在轉(zhuǎn)換宏里的那一個(gè)宏(_STR)就能得到正確的宏參數(shù).

          #define A (2)

          #define _STR(s) #s

          #define STR(s) _STR(s) // 轉(zhuǎn)換宏

          #define _CONS(a,b) int(a##e##b)

          #define CONS(a,b) _CONS(a,b) // 轉(zhuǎn)換宏

          printf("int max: %sn", STR(INT_MAX)); // INT_MAX,int型的最大值,為一個(gè)變量 #include

          輸出為: int max: 0x7fffffff

          STR(INT_MAX) --> _STR(0x7fffffff) 然后再轉(zhuǎn)換成字符串;

          printf("%dn", CONS(A, A));

          輸出為:200

          CONS(A, A) --> _CONS((2), (2)) --> int((2)e(2))

          三、'#'和'##'的一些應(yīng)用特例

          1、合并匿名變量名

          #define ___ANONYMOUS1(type, var, line) type var##line

          #define __ANONYMOUS0(type, line) ___ANONYMOUS1(type, _anonymous, line)

          #define ANONYMOUS(type) __ANONYMOUS0(type, __LINE__)

          例:ANONYMOUS(static int); 即: static int _anonymous70; 70表示該行行號(hào);

          第一層:ANONYMOUS(static int); --> __ANONYMOUS0(static int, __LINE__);

          第二層: --> ___ANONYMOUS1(static int, _anonymous, 70);

          第三層: --> static int _anonymous70;

          即每次只能解開(kāi)當(dāng)前層的宏,所以__LINE__在第二層才能被解開(kāi);

          2、填充結(jié)構(gòu)

          #define FILL(a) {a, #a}

          enum IDD{OPEN, CLOSE};

          typedef struct MSG{

          IDD id;

          const char * msg;

          }MSG;

          MSG _msg[] = {FILL(OPEN), FILL(CLOSE)};

          相當(dāng)于:

          MSG _msg[] = {{OPEN, "OPEN"},

          {CLOSE, "CLOSE"}};

          3、記錄文件名

          #define _GET_FILE_NAME(f) #f

          #define GET_FILE_NAME(f) _GET_FILE_NAME(f)

          static char FILE_NAME[] = GET_FILE_NAME(__FILE__);

          4、得到一個(gè)數(shù)值類(lèi)型所對(duì)應(yīng)的字符串緩沖大小 #define _TYPE_BUF_SIZE(type) sizeof #type #define TYPE_BUF_SIZE(type) _TYPE_BUF_SIZE(type) char buf[TYPE_BUF_SIZE(INT_MAX)]; --> char buf[_TYPE_BUF_SIZE(0x7fffffff)]; --> char buf[sizeof "0x7fffffff"]; 這里相當(dāng)于: char buf[11];

          c語(yǔ)言相關(guān)文章:c語(yǔ)言教程



          上一頁(yè) 1 2 3 4 下一頁(yè)

          關(guān)鍵詞: 單片機(jī) C語(yǔ)言 代碼

          評(píng)論


          相關(guān)推薦

          技術(shù)專(zhuān)區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();