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

BLUESKY
一步一個腳印向前走

今天在網上突然發現了下面幾個關于c代碼中的宏定義的說明,回想下,好像在系統的代碼中也見過這些零散的定義,但沒有注意,看到別人總結了下,發現果然很有用,雖然不知有的道可用與否,但也不失為一種手段,所以就先把它摘抄下來,增加一點見識:

1,防止一個頭文件被重復包含
#ifndef BODYDEF_H
#define BODYDEF_H
  //頭文件內容
#endif
2,得到指定地址上的一個字節或字
#define  MEM_B( x )  ( *( (byte *) (x) ) )
#define  MEM_W( x )  ( *( (word *) (x) ) )
3,得到一個field在結構體(struct)中的偏移量
#define FPOS( type, field ) ( (dword) &(( type *) 0)-> field )
4,得到一個結構體中field所占用的字節數
#define FSIZ( type, field ) sizeof( ((type *) 0)->field )
5,得到一個變量的地址(word寬度)
#define  B_PTR( var )  ( (byte *) (void *) &(var) )
#define  W_PTR( var )  ( (word *) (void *) &(var) )
6,將一個字母轉換為大寫
#define  UPCASE( c ) ( ((c) >= ''a'' && (c) <= ''z'') ? ((c) - 0x20) : (c) )
7,判斷字符是不是10進值的數字
#define  DECCHK( c ) ((c) >= ''0'' && (c) <= ''9'')
8,判斷字符是不是16進值的數字
#define  HEXCHK( c ) ( ((c) >= ''0'' && (c) <= ''9'') ||((c) >= ''A'' && (c) <= ''F'') ||((c) >= ''a'' && (c) <= ''f'') )
9,防止溢出的一個方法
#define  INC_SAT( val )  (val = ((val)+1 > (val)) ? (val)+1 : (val))
10,返回數組元素的個數
#define  ARR_SIZE( a )  ( sizeof( (a) ) / sizeof( (a[0]) ) )
11,使用一些宏跟蹤調試
ANSI標準說明了五個預定義的宏名。它們是:
_LINE_ (兩個下劃線),對應%d
_FILE_     對應%s
_DATE_   對應%s
_TIME_    對應%s
_STDC_

 
宏中"#"和"##"的用法
我們使用#把宏參數變為一個字符串,用##把兩個宏參數貼合在一起.
#define STR(s)     #s
#define CONS(a,b)  int(a##e##b)
Printf(STR(vck));           // 輸出字符串"vck"
printf("%d\n", CONS(2,3));  // 2e3 輸出:2000

當宏參數是另一個宏的時候
需要注意的是凡宏定義里有用"#"或"##"的地方宏參數是不會再展開.
#define A          (2)
#define STR(s)     #s
#define CONS(a,b)  int(a##e##b)
printf("%s\n", CONS(A, A));               // compile error 
這一行則是:
printf("%s\n", int(AeA));
INT_MAX和A都不會再被展開, 然而解決這個問題的方法很簡單. 加多一層中間轉換宏.
加這層宏的用意是把所有宏的參數在這層里全部展開, 那么在轉換宏里的那一個宏(_STR)就能得到正確的宏參數
#define STR(s)      _STR(s)          // 轉換宏
#define CONS(a,b)   _CONS(a,b)       // 轉換宏
printf("int max: %s\n", STR(INT_MAX));          // INT_MAX,int型的最大值,為一個變量 #include<climits>
輸出為: int max: 0x7fffffff
STR(INT_MAX) -->  _STR(0x7fffffff) 然后再轉換成字符串;

printf("%d\n", CONS(A, A));
輸出為:200
CONS(A, A)  -->  _CONS((2), (2))  --> int((2)e(2))

"#"和"##"的一些應用特例
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表示該行行號;
第一層:ANONYMOUS(static int);  -->  __ANONYMOUS0(static int, __LINE__);
第二層:                        -->  ___ANONYMOUS1(static int, _anonymous, 70);
第三層:                        -->  static int  _anonymous70;
即每次只能解開當前層的宏,所以__LINE__在第二層才能被解開;

2、填充結構
#define  FILL(a)   {a, #a}

enum IDD{OPEN, CLOSE};
typedef struct MSG{
  IDD id;
  const char * msg;
}MSG;

MSG _msg[] = {FILL(OPEN), FILL(CLOSE)};
相當于:
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、得到一個數值類型所對應的字符串緩沖大小
#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"];
這里相當于:
char  buf[11]; 

 

posted on 2007-11-20 12:12 LG 閱讀(17218) 評論(0)  編輯 收藏 引用 所屬分類: UnixProgram

<2007年11月>
28293031123
45678910
11121314151617
18192021222324
2526272829301
2345678

常用鏈接

相冊

最新評論

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            久久综合伊人77777尤物| 免费不卡在线视频| 亚洲欧美一区二区原创| 在线成人h网| 伊人狠狠色丁香综合尤物| 欧美三级视频| 国产精品久久中文| 国产视频亚洲| 最新中文字幕亚洲| 一区二区高清在线| 香蕉久久精品日日躁夜夜躁| 久久婷婷亚洲| 亚洲伦伦在线| 久久精品视频一| 欧美激情1区2区3区| 欧美日韩在线大尺度| 国产午夜亚洲精品理论片色戒| 激情视频一区| 亚洲综合激情| 亚洲高清成人| 亚洲天堂网在线观看| 久久精品人人做人人爽| 欧美日韩第一区| 又紧又大又爽精品一区二区| 99视频有精品| 久久国产婷婷国产香蕉| 午夜精品久久久久久久| 亚洲欧洲在线观看| 欧美一区午夜精品| 欧美国产欧美亚洲国产日韩mv天天看完整 | 国产伦精品一区二区三| 精品成人国产| 亚洲天天影视| 欧美国产免费| 久久精品国产v日韩v亚洲| 欧美日韩另类在线| 亚洲国产欧美日韩另类综合| 久久国产精品久久国产精品| 日韩视频二区| 欧美国产日韩二区| 精品成人一区二区三区| 亚洲欧美日韩国产成人| 亚洲国产一二三| 久久久xxx| 国内精品视频一区| 欧美一区三区三区高中清蜜桃| 亚洲精品系列| 欧美激情麻豆| 亚洲欧洲日本在线| 免费中文日韩| 久久久亚洲一区| 一区三区视频| 狂野欧美激情性xxxx| 午夜日韩在线观看| 国产精品综合| 先锋影音久久| 亚洲欧美综合| 国产精品欧美久久| 中文av字幕一区| 亚洲另类一区二区| 欧美日韩国产影片| 亚洲天堂av高清| 一本久久a久久免费精品不卡| 欧美精品18videos性欧美| 亚洲精品美女在线观看| 亚洲国产精品毛片| 欧美日本国产视频| 亚洲一区二区动漫| 一本色道久久综合亚洲精品婷婷 | 亚洲精品国产精品国自产观看| 久久人人爽国产| 久久视频精品在线| 亚洲精品资源美女情侣酒店| 亚洲激情网址| 欧美色综合网| 久久久久国产一区二区三区四区| 欧美一级淫片播放口| 久久国产毛片| 影音先锋成人资源站| 欧美国产免费| 欧美精品videossex性护士| 亚洲视频电影在线| 亚洲欧美日韩精品久久| 激情欧美一区二区三区| 91久久精品国产91久久| 欧美亚韩一区| 久久蜜桃av一区精品变态类天堂| 久久久久久高潮国产精品视| 亚洲免费激情| 欧美一区二区三区视频在线| 亚洲国产日韩美| 亚洲一区二区免费视频| 亚洲国产欧美日韩精品| 亚洲午夜在线| 亚洲国产第一| 亚洲欧美精品| 亚洲精品国产无天堂网2021| 91久久中文字幕| 国产精品青草久久久久福利99| 免费欧美电影| 国产精品乱码人人做人人爱| 免费观看成人网| 国产精品www色诱视频| 欧美mv日韩mv国产网站app| 欧美午夜精品久久久久久人妖| 鲁大师成人一区二区三区| 国产精品国产三级国产专区53| 欧美成ee人免费视频| 国产精品综合视频| 一本色道久久88综合亚洲精品ⅰ| 亚洲电影观看| 欧美一区二区在线免费播放| 亚洲最快最全在线视频| 久久久久女教师免费一区| 亚洲女人天堂成人av在线| 欧美成人自拍视频| 久久伊伊香蕉| 国产一区在线看| 亚洲欧美国产另类| 亚洲综合社区| 欧美日韩免费视频| 91久久精品国产91久久| 亚洲国产高潮在线观看| 久久精品国产久精国产爱| 欧美淫片网站| 国产麻豆精品久久一二三| 亚洲网站在线| 午夜精品久久久久| 国产精品成人一区二区三区夜夜夜| 亚洲国产电影| 91久久午夜| 久久久久成人网| 久久中文在线| 激情久久久久久| 久久久久久尹人网香蕉| 男女精品网站| 亚洲国产精品一区在线观看不卡| 欧美一区二区久久久| 久久精品成人一区二区三区蜜臀 | 免费成人av| 国内精品久久久久久久果冻传媒| 久久久久久久久综合| 国产亚洲欧美在线| 欧美在线视频免费| 久久夜色精品国产亚洲aⅴ| 黄色成人免费观看| 久久久精品动漫| 欧美激情久久久久久| 亚洲人成网站999久久久综合| 欧美jjzz| 亚洲精品视频在线播放| 亚洲一区免费看| 国产女优一区| 久久精品91| 欧美激情91| 一本色道久久99精品综合| 欧美视频中文字幕| 午夜在线观看欧美| 欧美成人精品h版在线观看| 亚洲国产一区视频| 欧美日韩成人在线视频| 亚洲欧美日本另类| 麻豆成人在线播放| 一区二区日韩免费看| 国产精品久久一区二区三区| 久久精品国产69国产精品亚洲| 欧美激情aaaa| 亚洲欧美制服另类日韩| 韩国成人福利片在线播放| 欧美成年网站| 亚洲欧美日韩精品在线| 老司机午夜精品视频在线观看| 亚洲免费播放| 国产视频丨精品|在线观看| 欧美va天堂在线| 亚洲欧美成人网| 亚洲国产mv| 久久久国产精品亚洲一区| 99www免费人成精品| 国内久久视频| 国产精品二区二区三区| 美国十次了思思久久精品导航| 亚洲一区二区成人| 亚洲第一区中文99精品| 久久福利毛片| 亚洲一区二区视频| 91久久久久久国产精品| 国产一区二区三区精品久久久| 欧美日韩国产区一| 卡通动漫国产精品| 欧美一级片一区| 亚洲婷婷综合色高清在线| 免费欧美日韩| 久久精品国产免费看久久精品| 99re国产精品| 亚洲精品乱码久久久久久蜜桃麻豆 | 亚洲欧美日产图| 一本色道精品久久一区二区三区 | 日韩一区二区精品视频| 欧美激情亚洲另类|