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

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 閱讀(17223) 評論(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>
            国产主播精品| 亚洲日本一区二区| 午夜精品美女久久久久av福利| 亚洲精品日韩在线| 欧美日韩一区二区三区在线| 一区二区高清视频| 亚洲无毛电影| 国产在线不卡精品| 欧美国产另类| 欧美福利视频一区| 亚洲综合色丁香婷婷六月图片| 亚洲午夜久久久久久久久电影网| 国产精品美女主播在线观看纯欲| 亚洲欧美日韩精品久久奇米色影视 | 国产精品专区第二| 欧美一区二区三区日韩| 久久久久久久久伊人| 亚洲欧洲三级| 中日韩美女免费视频网站在线观看| 国产精品videosex极品| 久久成年人视频| 久久婷婷人人澡人人喊人人爽| 亚洲精品视频免费在线观看| 中日韩美女免费视频网址在线观看| 国产亚洲人成网站在线观看| 亚洲国产精品999| 国产精品美女诱惑| 久久综合导航| 欧美午夜a级限制福利片| 欧美专区亚洲专区| 欧美激情一区二区三区高清视频 | 极品少妇一区二区三区精品视频| 欧美激情亚洲自拍| 国产欧美在线播放| 亚洲精品美女在线| 在线观看一区二区视频| 99re66热这里只有精品3直播| 国产综合欧美| 一区二区三区视频在线观看| 在线播放精品| 欧美亚洲综合另类| 亚洲一区三区视频在线观看| 久久综合中文| 欧美一区二区三区播放老司机| 欧美阿v一级看视频| 久久成人免费网| 欧美日韩网站| 亚洲国产精品美女| 亚洲二区在线观看| 久久av老司机精品网站导航| 亚洲一区在线直播| 欧美日韩国产亚洲一区| 亚洲福利专区| 亚洲高清自拍| 久久久噜噜噜| 麻豆成人在线| 国内视频一区| 欧美亚洲网站| 久久精品中文字幕一区二区三区| 国产精品高潮视频| 中文在线不卡视频| 亚洲一区日韩| 国产精品女人毛片| 亚洲一二三四久久| 亚洲伊人久久综合| 欧美性色综合| 亚洲视频中文| 亚洲综合第一| 国产精品自拍视频| 亚洲中字黄色| 久久久久成人精品| 国产私拍一区| 午夜精品区一区二区三| 欧美在线不卡视频| 国产一区二区在线免费观看| 午夜精品久久久久久久久久久| 欧美在线1区| 国产亚洲一区二区在线观看 | 亚洲精品久久视频| 一区二区三区免费网站| 欧美日本网站| 一本色道久久综合亚洲二区三区| 亚洲一区欧美一区| 国产日韩欧美一区二区三区在线观看 | 欧美高清视频一区二区三区在线观看| 黑人一区二区| 欧美激情精品久久久久久久变态| 亚洲区中文字幕| 亚洲一区二区三区影院| 国产精品视频精品视频| 欧美一级久久久| 欧美插天视频在线播放| av不卡在线观看| 国产精品免费看片| 久久久www成人免费无遮挡大片 | 欧美α欧美αv大片| 亚洲人成网站色ww在线| 欧美视频二区| 久久久精品国产免大香伊| 亚洲成人在线视频网站| 亚洲一区二区三区激情| 激情欧美亚洲| 欧美美女日韩| 欧美影院一区| 亚洲国产黄色| 久久国产视频网| 亚洲精品美女久久7777777| 国产精品乱看| 欧美成人福利视频| 亚洲欧美日韩一区二区| 亚洲国产高清在线| 欧美在线高清视频| 日韩一二三区视频| 国产人成一区二区三区影院| 欧美成人一区二区在线| 亚洲中无吗在线| 亚洲精品久久久久中文字幕欢迎你| 久久不射电影网| 亚洲一区在线播放| 亚洲全部视频| 在线观看欧美成人| 国产欧美日韩视频| 欧美日韩一区二区三区视频| 老司机一区二区三区| 欧美一二三视频| 一区二区成人精品 | 亚洲美女网站| 欧美国产高清| 快播亚洲色图| 久久精品一二三| 性欧美长视频| 亚洲——在线| 亚洲专区在线| 亚洲午夜精品在线| 夜夜嗨av一区二区三区免费区| 在线欧美日韩精品| 合欧美一区二区三区| 国产一区二区黄色| 国产精品资源| 国产欧美日韩综合一区在线观看| 欧美色欧美亚洲高清在线视频| 欧美激情久久久| 欧美激情视频给我| 欧美成人综合一区| 欧美国产视频一区二区| 欧美顶级少妇做爰| 欧美ed2k| 欧美国产日产韩国视频| 欧美大片一区二区三区| 美女日韩欧美| 欧美精品七区| 欧美日韩精品在线视频| 欧美三级电影一区| 国产精品久久久久aaaa樱花 | 久久五月天婷婷| 久久只有精品| 欧美a级片一区| 欧美日韩p片| 国产精品国色综合久久| 国产欧美一二三区| 黄色在线成人| 最近中文字幕mv在线一区二区三区四区| 亚洲国产精品成人综合色在线婷婷| 亚洲电影视频在线| 亚洲精品一级| 亚洲欧美日韩在线不卡| 久久精品久久综合| 你懂的国产精品| 亚洲日韩欧美视频一区| 亚洲校园激情| 久久久久久伊人| 欧美激情亚洲国产| 国产精品久久看| 在线精品国产成人综合| 亚洲每日在线| 欧美在线免费| 亚洲国产成人精品视频| 亚洲一区二区三区高清| 久久久av毛片精品| 欧美色另类天堂2015| 国产在线精品一区二区中文| 亚洲精品一二三区| 久久精品国产欧美激情| 亚洲日本电影在线| 欧美亚洲一区二区在线| 欧美精品一区二区三区在线播放| 国产精品手机视频| 亚洲国产精品成人久久综合一区 | 怡红院精品视频| 亚洲小说欧美另类婷婷| 免费亚洲电影在线| 亚洲一区二区免费看| 欧美freesex交免费视频| 国产精品主播| 一区二区三区欧美| 老司机免费视频久久| 亚洲自拍偷拍网址| 欧美日韩不卡| 亚洲欧洲在线看| 久久漫画官网|