




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、#define用法集錦Definition:The #define DirectiveYou can use the #define directive to give a meaningful name to a constant in your program. The two forms of the syntax are: Syntax#define identifier token-stringopt#define identifier( identifieropt, . , identifieropt token-stringopt Usage:1.
2、; 簡單的define定義#define MAXTIME 1000 一個(gè)簡單的MAXTIME就定義好了,它代表1000,如果在程序里面寫if(i 編譯器在處理這個(gè)代碼之前會(huì)對(duì)MAXTIME進(jìn)行處理替換為1000。這樣的定義看起來類似于普通的常量定義CONST,但也有著不同,因?yàn)閐efine的定義更像是簡單的文本替換,而不是作為一個(gè)量來使用,這個(gè)問題在下面反映的尤為突出。2.define的“函數(shù)定義”define可以像函數(shù)那樣接受一些參數(shù),如下#define max(x,y (x>(y?(x:(y;這個(gè)定義就將返回兩個(gè)數(shù)中較大的那個(gè),看到了嗎
3、?因?yàn)檫@個(gè)“函數(shù)”沒有類型檢查,就好像一個(gè)函數(shù)模板似的,當(dāng)然,它絕對(duì)沒有模板那么安全就是了??梢宰鳛橐粋€(gè)簡單的模板來使用而已。但是這樣做的話存在隱患,例子如下:#define Add(a,b a+b;在一般使用的時(shí)候是沒有問題的,但是如果遇到如:c * Add(a,b * d的時(shí)候就會(huì)出現(xiàn)問題,代數(shù)式的本意是a+b然后去和c,d相乘,但是因?yàn)槭褂昧薲efine(它只是一個(gè)簡單的替換),所以式子實(shí)際上變成了c*a + b*d另外舉一個(gè)例子:#define pin (int*;pin a,b;本意是a和b都是int型指針,但是實(shí)際上變成int* a,b;a是int型指針,而b是int型變量。這是應(yīng)
4、該使用typedef來代替define,這樣a和b就都是int型指針了。所以我們?cè)诙x的時(shí)候,養(yǎng)成一個(gè)良好的習(xí)慣,建議所有的層次都要加括號(hào)。3.宏的單行定義(少見用法)#define A(x T_#x#define B(x #x#define C(x #x我們假設(shè):x=1,則有:A(1-T_1B(1-'1'C(1-"1"(這里參考了 hustli的文章)3.define的多行定義define可以替代多行的代碼,例如MFC中的宏定義(非常的經(jīng)典,雖然讓人看了惡心)#define MACRO(arg1, arg2 do /* declarations */ st
5、mt1; stmt2; /* . */ while(0 /* (no trailing ; */關(guān)鍵是要在每一個(gè)換行的時(shí)候加上一個(gè)"" 4.在大規(guī)模的開發(fā)過程中,特別是跨平臺(tái)和系統(tǒng)的軟件里,define最重要的功能是條件編譯。就是:#ifdef WINDOWS.#endif#ifdef LINUX.#endif可以在編譯的時(shí)候通過#define設(shè)置編譯環(huán)境5.如何定義宏、取消宏/定義宏#define MacroName MacroValue/取消宏#undef MacroName/普通宏#define PI (3.1415926帶參數(shù)的宏#define max(a,b (a
6、>(b? (a,(b關(guān)鍵是十分容易產(chǎn)生錯(cuò)誤,包括機(jī)器和人理解上的差異等等。6.條件編譯#ifdef XXX(#else #endif例如#ifdef DV22_AUX_INPUT#define AUX_MODE 3 #else#define AUY_MODE 3#endif#ifndef XXX (#else #endif7.頭文件(.h可以被頭文件或C文件包含;重復(fù)包含(重復(fù)定義)由于頭文件包含可以嵌套,那么C文件就有可能包含多次同一個(gè)頭文件,就可能出現(xiàn)重復(fù)定義的問題的。通過條件編譯開關(guān)來避免重復(fù)包含(重復(fù)定義)例如#ifndef _headerfileXXX_#define _hea
7、derfileXXX_/文件內(nèi)容#endif Instances:1、防止一個(gè)頭文件被重復(fù)包含#ifndef COMDEF_H#define COMDEF_H /頭文件內(nèi)容#endif2、重新定義一些類型,防止由于各種平臺(tái)和編譯器的不同,而產(chǎn)生的類型字節(jié)數(shù)差異,方便移植。typedef unsigned char boolean; /* Boolean value type. */typedef unsigned
8、long int uint32; /* Unsigned 32 bit value */typedef unsigned short uint16; /* Unsigned 16 bit value */typedef unsigned char uint8;
9、160; /* Unsigned 8 bit value */typedef signed long int int32; /* Signed 32 bit value */typedef signed short int16;
10、0; /* Signed 16 bit value */typedef signed char int8; /* Signed 8 bit value */下面的不建議使用typedef unsigned char byte;
11、 /* Unsigned 8 bit value type. */typedef unsigned short word; /* Unsinged 16 bit value type. */typedef unsigned long dword; &
12、#160; /* Unsigned 32 bit value type. */typedef unsigned char uint1; /* Unsigned 8 bit value type. */typedef unsigned short uint2;
13、60; /* Unsigned 16 bit value type. */typedef unsigned long uint4; /* Unsigned 32 bit value type. */typedef signed char int1;
14、 /* Signed 8 bit value type. */typedef signed short int2; /* Signed 16 bit value type. */typedef long int int4;
15、160; /* Signed 32 bit value type. */typedef signed long sint31; /* Signed 32 bit value */typedef signed short sint15;
16、 /* Signed 16 bit value */typedef signed char sint7; /* Signed 8 bit value */3、得到指定地址上的一個(gè)字節(jié)或字#define MEM_B( x ( *( (byte * (x #define MEM_W( x
17、 ( *( (word * (x 4、求最大值和最小值 #define MAX( x, y ( (x > (y ? (x : (y #define MIN( x, y ( (x < (y ? (x : (y 5、得到一個(gè)field在結(jié)構(gòu)體(struct中的偏移量#define FPOS( type, field /*lint -e545 */ ( (dword &( type * 0-> field /*lint +e545 */6、得到一個(gè)結(jié)構(gòu)體中fi
18、eld所占用的字節(jié)數(shù)#define FSIZ( type, field sizeof( (type * 0->field 7、按照LSB格式把兩個(gè)字節(jié)轉(zhuǎn)化為一個(gè)Word#define FLIPW( ray ( (word (ray0 * 256 + (ray1 8、按照LSB格式把一個(gè)Word轉(zhuǎn)化為兩個(gè)字節(jié)#define FLOPW( ray, val (ray0 = (val / 256; (ray1 = (val & 0xFF9、得到一個(gè)變量的地址(word寬度)#define
19、0; B_PTR( var ( (byte * (void * &(var #define W_PTR( var ( (word * (void * &(var 10、得到一個(gè)字的高位和低位字節(jié)#define WORD_LO(xxx (byte (word(xxx & 255#define WORD_HI(xxx (byte (word(xxx >> 811、返回一個(gè)比X大的最接近的8的倍數(shù)#
20、define RND8( x (x + 7 / 8 * 8 12、將一個(gè)字母轉(zhuǎn)換為大寫#define UPCASE( c ( (c >= 'a' && (c <= 'z' ? (c - 0x20 : (c 13、判斷字符是不是10進(jìn)值的數(shù)字#define DECCHK( c (c >= '0' && (c <= '9'14、判斷字符是不是16進(jìn)值的數(shù)字#def
21、ine HEXCHK( c ( (c >= '0' && (c <= '9' | (c >= 'A' && (c <= 'F' |(c >= 'a' &&
22、(c <= 'f' 15、防止溢出的一個(gè)方法#define INC_SAT( val (val = (val+1 > (val ? (val+1 : (val16、返回?cái)?shù)組元素的個(gè)數(shù)#define ARR_SIZE( a ( sizeof( (a / sizeof( (a0 17、返回一個(gè)無符號(hào)數(shù)n尾的值MOD_BY_POWER_OF_TWO(X,n=X%(2n#define MOD_BY_POWER_OF_TWO( val, mod_by
23、; ( (dword(val & (dword(mod_by-1 18、對(duì)于IO空間映射在存儲(chǔ)空間的結(jié)構(gòu),輸入輸出處理 #define inp(port (*(volatile byte * (port #define inpw(port (*(volatile word
24、* (port #define inpdw(port (*(volatile dword *(port #define outp(port, val (*(volatile byte * (port = (byte (val #define outpw(port, val (*(volatile word * (port = (word (val #define outpdw(port, v
25、al (*(volatile dword * (port = (dword (val19、使用一些宏跟蹤調(diào)試ANSI標(biāo)準(zhǔn)說明了五個(gè)預(yù)定義的宏名。它們是:_LINE_FILE_DATE_TIME_STDC_C+中還定義了 _cplusplus如果編譯器不是標(biāo)準(zhǔn)的,則可能僅支持以上宏名中的幾個(gè),或根本不支持。記住編譯程序也許還提供其它預(yù)定義的宏名。_LINE_ 及 _FILE_ 宏指示,#line指令可以改變它的值,簡單的講,編譯時(shí),它們包含程序的當(dāng)前行數(shù)和文件名。_DATE_ 宏指令含有形式為月/日/年的串,表示源文件被翻譯到代碼時(shí)的日期。_TIME_ 宏指令包含程序編譯的時(shí)間。時(shí)間用字符串表示,其形式為:分:秒_STDC_ 宏指令的意義是編譯時(shí)定義的。一般來講,如果_STDC_已經(jīng)定義,編譯器將僅接受不包含任何非標(biāo)準(zhǔn)擴(kuò)展的標(biāo)準(zhǔn)C/C+代碼。如果實(shí)現(xiàn)是標(biāo)準(zhǔn)的,則宏_STDC_含有十進(jìn)制常量1。如果它含有任何其它數(shù),則實(shí)現(xiàn)是非標(biāo)準(zhǔn)的。_cplusplus 與標(biāo)準(zhǔn)c+一致的編譯器把它定義為一個(gè)包含至少6為的數(shù)值。與標(biāo)準(zhǔn)c+不一致的編譯器將使用具有5位或更少的數(shù)值。可以定義宏,例如:當(dāng)定義了_DEBUG
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年短視頻平臺(tái)內(nèi)容監(jiān)管與平臺(tái)經(jīng)濟(jì)報(bào)告
- 2025年文化遺產(chǎn)數(shù)字化保護(hù)與文化遺產(chǎn)旅游市場的營銷策略報(bào)告
- 教育大數(shù)據(jù)在教育資源優(yōu)化配置中的應(yīng)用實(shí)踐報(bào)告
- 2025年云計(jì)算服務(wù)模式演進(jìn)與行業(yè)應(yīng)用市場前景研究報(bào)告
- 2025年元宇宙社交平臺(tái)游戲化設(shè)計(jì):用戶體驗(yàn)與互動(dòng)體驗(yàn)報(bào)告
- 2025年元宇宙社交平臺(tái)用戶互動(dòng)性與社交價(jià)值研究報(bào)告
- 2025年元宇宙社交平臺(tái)虛擬現(xiàn)實(shí)設(shè)備兼容性與用戶體驗(yàn)研究
- 2025年元宇宙社交平臺(tái)虛擬社交活動(dòng)策劃與用戶體驗(yàn)優(yōu)化報(bào)告
- 2025年醫(yī)院信息化建設(shè)醫(yī)院圖書館管理系統(tǒng)初步設(shè)計(jì)評(píng)估報(bào)告
- 零售行業(yè)私域流量運(yùn)營數(shù)據(jù)分析與效果評(píng)估報(bào)告
- 2025年湖北省中考道德與法治真題含答案
- 2024年上海浦東新區(qū)公辦學(xué)校儲(chǔ)備教師招聘筆試真題
- 物流司機(jī)獎(jiǎng)罰管理制度
- 體裁教學(xué)法在高中英語閱讀教學(xué)中的應(yīng)用研究-以說明文為例
- 項(xiàng)目總工聘用合同書
- 7數(shù)滬科版期末考試卷-2024-2025學(xué)年七年級(jí)(初一)數(shù)學(xué)下冊(cè)期末考試模擬卷02
- 2025至2030中國城市公共交通行業(yè)深度發(fā)展研究與企業(yè)投資戰(zhàn)略規(guī)劃報(bào)告
- 2025春季學(xué)期國開電大本科《管理英語4》一平臺(tái)機(jī)考真題及答案(第八套)
- 2025屆上海市中考語文真題作文題目解析+范文
- 2025年全國統(tǒng)一高考英語試卷(全國一卷)含答案
- 2025年全國普通高校招生全國統(tǒng)一考試數(shù)學(xué)試卷(新高考Ⅰ卷)含答案
評(píng)論
0/150
提交評(píng)論