亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

認識宏,C語言的萬惡之首

2019-11-17 05:48:38
字體:
來源:轉載
供稿:網友

  水平不高不低的C/C++程序員最喜歡掛在嘴上的一句話就是:C宏,萬惡之首,錯誤的開端,應該被廢棄。當然,我也是水平一般的人。但是我們不能把C語言本身做為使自己程序出錯的原因。假如我們出錯了,那只能毫不客氣地說,那是因為我們用的太不專業,用的太不仔細。那就讓我們一起來看幾個有關宏定義的經典的例子。我的博客里有篇文章叫《預處理器之我見》,雖然,我已經提到過宏的事情,但那篇文章中談到的都是一些簡單的宏定義,下面的定義不是出自我工作中的程序,但我決定人家用的那叫絕,所以我們一起來走進C語言的萬惡之首吧。

  例一、用C宏,書寫代碼更簡潔這段代碼寫網絡程序的朋友都很眼熟,是Net/3中mbuf的實現。

strUCt mbuf{ struct m_hdr mhdr; union {
 struct {
  struct pkthdr MH_pkthdr;
  /* M_PKTHDR set */
  union {
   struct m_ext MH_ext;
   /* M_EXT set */
   char MH_databuf[MHLEN];
  }
  MH_dat;
 }MH;
 char M_databuf[MLEN];
 /* !M_PKTHER, !M_EXT*/
 }
 M_dat;
};
  上面的代碼,假如我想訪問最里層的MH_databuf,那么我必須寫M_dat.MH.MH_dat.MH_databuf; 這是不是很長,很難寫呀?這樣的代碼閱讀起來也不明了。其實,對于MH_pkthdr、MH_ext、MH_databuf來說,雖然不是在一個結構層次上,但是假如我們站在mbuf之外來看,它們都是mbuf的屬性,完全可以壓扁到一個平面上去看。所以,源碼中有這么一組宏:

#define m_next m_hdr.mh_next#define m_len m_hdr.mh_len#define m_data m_hdr.mh_data... ...#define m_pkthdr M_dat.MH.MH_pkthdr#define m_pktdat M_dat.MH.MH_dat.MH_databuf... ...
  這樣寫起代碼來,是不是很精練呢!

  例二、用C宏,實現跨平臺和編譯器的需要以及自動生成代碼,這方面的例子太好舉了,一下是我從工作中隨便copy的一些代碼。

#define __F_ADDR_(pa) *(_VPWord)(pa)
#define __F_ADDRDWD_(pa) *(_VPDWORD)(pa)

#define __ADR_0x000 *(_VPWORD)(__FADR_OFFSET0x000)
#define __ADR_0xXXX __ADR_0x000

#define __ADR_0x002 *(_VPWORD)(__FADR_OFFSET0x002)
#define __ADR_0xAAA *(_VPWORD)(__FADR_OFFSET0xaaa)
#define __ADR_0x555 *(_VPWORD)(__FADR_OFFSET+0x554)

#define __F_RESET(sa) __ADR_0x000 =0xf0

#define __F_AUTO_SELECT __ADR_0xAAA =0xaa;/
__ADR_0x555 =0x55;/
__ADR_0xAAA =0x90

#define __F_PROGRAM_(pa,pd) __ADR_0xAAA =0xaa;/
__ADR_0x555 =0x55;/
__ADR_0xAAA =0xA0;/
*(_VPWORD)(pa)=pd

#define __F_CHip_ERASE __ADR_0xAAA =0xaa;/
__ADR_0x555 =0x55;/
__ADR_0xAAA =0x80;/
__ADR_0xAAA =0xaa;/
__ADR_0x555 =0x55;/
__ADR_0xAAA =0x10

#define __F_SEC_ERASE_(sa) __ADR_0xAAA =0xaa;/
__ADR_0x555 =0x55;/
__ADR_0xAAA =0x80;/
__ADR_0xAAA =0xaa;/
__ADR_0x555 =0x55;/
*(_VPWORD)(sa) =0x30
  例三、學習一下老外用的宏。這是在《C專家編程》上的一個例子,很經典,所以我就用拿來主意,和大家分享一下。

  根據位模式構建圖形圖標(icon)或者圖形(glyph),是一種小型的位模式映射于屏幕產生的圖像。一個位代表圖像上的一個像素。假如一個位被設置,那么它所代表的像素就是“亮”的。假如一個位被清除,那么它所代表的像素就是“暗”的。所以,一系列的整數值能夠用于為圖像編碼。類似Iconedit這樣的工具就是用于繪圖的,他們所輸出的是一個包含一系列整型數的ASCII文件,可以被一個窗口程序所包含。它所存在的問題是程序中的圖標只是一串十六進制數。在C語言中,典型的16X16的黑白圖形可能如下:

static unsigned short stopwatch[] = {0x07C6,0x1FF7,0x383B,0x600C,0x600C,0xC006,0xC006,0xDF06,0xC106,0xC106,0x610C,0x610C,0x3838,0x1FF0,0x07C0,0x0000};
  正如所看到的那樣,這些C語言常量并未有提供有關圖形實際模樣的任何線索。這里有一個驚人的#define定義的優雅集合,答應程序建立常量使它們看上去像是屏幕上的圖形。


#define X )*2+1#define _ )*2#define s ((((((((((((((((0 /* For building glyphs 16 bits wide */
  定義了它們之后,只要畫所需要的圖標或者圖形等,程序會自動創建它們的十六進制模式。使用這些宏定義,程序的自描述能力大大加強,上面這個例子可以轉變為:

static unsigned short stopwatch[] ={
 s _ _ _ _ _ X X X X X _ _ _ X X _ ,s _ _ _ X X X X X X X X X _ X X X ,s _ _ X X X _ _ _ _ _ X X X _ X X ,s _ X X _ _ _ _ _ _ _ _ _ X X _ _ ,s _ X X _ _ _ _ _ _ _ _ _ X X _ _ ,s X X _ _ _ _ _ _ _ _ _ _ _ X X _ ,s X X _ _ _ _ _ _ _ _ _ _ _ X X _ ,s X X _ X X X X X _ _ _ _ _ X X _ ,s X X _ _ _ _ _ X _ _ _ _ _ X X _ ,s X X _ _ _ _ _ X _ _ _ _ _ X X _ ,s _ X X _ _ _ _ X _ _ _ _ X X _ _ ,s _ X X _ _ _ _ X _ _ _ _ X X _ _ ,s _ _ X X X _ _ _ _ _ X X X _ _ _ ,s _ _ _ X X X X X X X X X _ _ _ _ ,s _ _ _ _ _ X X X X X _ _ _ _ _ _ ,s _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
};
  顯然,與前面的代碼相比,它的意思更為明顯。標準的C語言具有八進制、十進制和十六進制常量,但沒有二進制常量,否則的話倒是一種更為簡單的繪制圖形模式的方法。

  千萬不要忘了在繪圖結束后清除這些宏定義,否這很可能會給你后面的代碼帶來不可猜測的后果。

  結束了,最后一句忠告,宏就像C語言工程師手中的一把雙刃劍,假如能很好的利用它,它就會死心塌地的為你服務,不過可不要把自己的手給弄破了啊。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲男子天堂网| 92国产精品久久久久首页| 91超碰中文字幕久久精品| 久久久黄色av| 北条麻妃久久精品| 欧美精品在线免费观看| 国a精品视频大全| 欧美性猛交xxxx乱大交3| 欧美成人免费在线视频| 欧美做受高潮1| 亚洲最大福利视频| 亚洲第一中文字幕| 欧美一区二区大胆人体摄影专业网站| 亚洲欧美日韩一区二区三区在线| 日本伊人精品一区二区三区介绍| 欧美日韩精品在线| 亚洲精品黄网在线观看| 色狠狠久久aa北条麻妃| 欧美国产欧美亚洲国产日韩mv天天看完整| 久久91精品国产91久久跳| 亚洲性生活视频在线观看| 久久精品国产亚洲精品2020| 久热精品在线视频| 亚洲伦理中文字幕| 国产精品久久久久免费a∨大胸| 精品偷拍一区二区三区在线看| 亚洲第一网站男人都懂| 日本伊人精品一区二区三区介绍| 成人在线视频网站| 亚洲电影在线看| 国产精品久久久久久超碰| 国产精品老女人视频| 欧美激情综合色| 日韩精品在线视频观看| 久久av在线看| 国产主播在线一区| 77777亚洲午夜久久多人| 5566日本婷婷色中文字幕97| 久久这里有精品视频| 2019中文字幕在线观看| 精品动漫一区二区| 欧美黄色片视频| 97在线免费观看视频| 国产精品久久电影观看| 亚洲欧美综合v| 粉嫩老牛aⅴ一区二区三区| 68精品久久久久久欧美| 欧美视频中文在线看| 一区二区三区www| 亚洲自拍中文字幕| 91亚洲永久免费精品| 欧美www视频在线观看| 亚洲国产精久久久久久久| 97免费视频在线| 欧美视频在线免费看| 国产精品视频免费在线| 欧美激情欧美狂野欧美精品| 亚洲偷熟乱区亚洲香蕉av| 国产一区二区在线免费| 日韩精品在线观看一区| 久久亚洲精品小早川怜子66| 亚洲变态欧美另类捆绑| 日本高清久久天堂| 亚洲欧美日韩区| 欧美成人午夜激情视频| 日韩在线观看网址| 97免费中文视频在线观看| 久久久久久成人| 亚洲色图激情小说| 91九色视频在线| 国产免费一区二区三区在线能观看| 视频在线一区二区| 北条麻妃在线一区二区| 另类美女黄大片| 欧美日韩在线第一页| 午夜精品视频在线| 美女黄色丝袜一区| 久久久久久12| 日韩av最新在线观看| 久久久久久中文字幕| 日韩av在线免费观看一区| 麻豆国产va免费精品高清在线| 国产欧美日韩精品专区| 国产99在线|中文| 欧美与欧洲交xxxx免费观看| 亚洲欧美精品伊人久久| 日韩av电影在线网| 亚洲一区二区中文字幕| 欧美福利视频网站| 日韩精品极品在线观看播放免费视频| 国产精品aaaa| 成人福利视频在线观看| 欧美另类在线播放| 国产69精品久久久久9| 亚洲美女又黄又爽在线观看| 国内精品400部情侣激情| 色爱av美腿丝袜综合粉嫩av| 中文字幕精品视频| 亚洲性xxxx| 欧美亚洲视频一区二区| 国产精品视频久久久久| 亚洲91av视频| 精品偷拍一区二区三区在线看| 欧美日韩亚洲系列| 亚洲国产欧美一区二区三区同亚洲| 亚洲国产高潮在线观看| 成人黄色免费看| 91高潮在线观看| 亚洲视频电影图片偷拍一区| 亚洲黄色www网站| 久国内精品在线| 国产精品吹潮在线观看| 精品国产电影一区| 日韩女优在线播放| 国产精品久久久久9999| 久久久成人av| 亚洲第一av在线| 欧美激情在线狂野欧美精品| 日韩中文字幕久久| 在线看日韩av| 亚洲国产精品电影在线观看| 91九色蝌蚪国产| 国产精品福利观看| 日韩中文字幕在线免费观看| 欧美亚洲国产日本| 一本色道久久综合狠狠躁篇怎么玩| 欧美裸体视频网站| 欧美福利视频在线观看| 亚洲人成人99网站| 日本免费在线精品| 2020欧美日韩在线视频| 亚洲第一免费网站| 亚洲性生活视频在线观看| 亚洲精品欧美极品| 亚洲激情电影中文字幕| 久久久国产精品一区| 日韩在线www| 亚洲免费影视第一页| 国产精品高潮视频| 欧美大全免费观看电视剧大泉洋| 国产精品日韩在线观看| 4p变态网欧美系列| 欧美久久久精品| 久久久久久91| 亚洲电影免费观看高清完整版在线观看| 亚洲人成网站在线播| 欧美在线视频一区二区| 日韩国产欧美区| 中文字幕一精品亚洲无线一区| 98精品国产高清在线xxxx天堂| 午夜精品一区二区三区在线视频| 姬川优奈aav一区二区| 欧美激情第99页| 伦理中文字幕亚洲| 国产精品丝袜久久久久久不卡| 久久久久亚洲精品| 最近2019中文字幕mv免费看| 日本久久久久久久久久久| 国产成人a亚洲精品| 亚洲第一区第二区| 免费成人高清视频| 国产综合在线观看视频| 久久久久久久久91| 亚洲国产精品资源|