預(yù)處理位操作_第1頁
預(yù)處理位操作_第2頁
預(yù)處理位操作_第3頁
預(yù)處理位操作_第4頁
預(yù)處理位操作_第5頁
已閱讀5頁,還剩10頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

課程主要內(nèi)容預(yù)處理位操作問題與習(xí)題第一部分專題主要內(nèi)容

1.1宏定義1.2條件編譯1.3文件包含2.1位操作1.1宏定義(1)宏定義普通宏#definePI(3.1415926)帶參數(shù)的宏#definemax(a,b)((a)>(b)?(a),(b))取消定義#undef MacroName為什么要用宏定義維護(hù)性:有時我們需要將某個特定數(shù)據(jù)(如某個數(shù)據(jù)表的大?。┰诔绦蛑谐霈F(xiàn)的所有實例統(tǒng)統(tǒng)加以修改,我們希望能夠只做一個改動就達(dá)到目的#defineMAXSIZE100在函數(shù)調(diào)用的時候會帶來重大的系統(tǒng)開銷,因此我們有時希望有一個程序塊,看上去像一個函數(shù),但卻沒有函數(shù)調(diào)用的開銷#definemax(a,b)(((a)>=(b))?(a):(b))提高程序的易讀性:文字比數(shù)字要容易理解多,一個好的宏名可以顧名思義。1.1宏定義(2)宏定義的特點宏定義值使用宏名代替一個字符串,不做語法檢查對程序中用雙括號括起來的字符串內(nèi)部的字符,即使與宏名相同,也不進(jìn)行替換函數(shù)調(diào)用和宏定義的區(qū)別函數(shù)調(diào)用時,先求出實參表達(dá)式的值,然后代入形參。而使用帶參數(shù)的宏只是進(jìn)行簡單的字符替換對于函數(shù)調(diào)用,對實參要進(jìn)行類型檢查,如果實參與形參類型不一致,應(yīng)進(jìn)行類型轉(zhuǎn)換,如果無法轉(zhuǎn)換,編譯時會出錯。但是宏定義不會做類型檢查宏定義和類型定義的區(qū)別宏定義不做語法檢查,可以把任何字符串定義成類型#defineAinteger/*integer不是一個合法的類型*/使用宏定義結(jié)果有時與預(yù)期的不同#defineT1structstudent*Typedefstructstudent*T2;T1a,b;/*相當(dāng)于structstudent*a,b,b不是結(jié)構(gòu)體指針,與預(yù)期的不同*/T2a,b;1.1宏定義(3)使用宏定義需要注意不要忽視宏定義中的空格#definef(x)(x)+1//實際上是把f定義成了(x)(x)+1

對于不帶參數(shù)的宏,若宏值多于一項,一定要使用括號#defineMAX(M+N)要給每個參數(shù)加上括號,否則可能會影響計算的優(yōu)先級#defineabs(x)(x>=0)?x:-xz=abs(a+b);/*相當(dāng)于z=(a+b>=0)?a+b:-a+b//修改后#defineabs(x)((x)>=0?(x):-(x)盡量用typedef而不是宏定義去定義類型1.2條件編譯條件編譯例子

#ifdefBMW #defineSIZE16 #else#defineSIZE32 #endif條件編譯指令#ifdef…#else…#endif#ifndef…#else…#endif#if1…#else…#endif#if0…#else…#endif條件編譯的應(yīng)用解決頭文件重復(fù)包含的問題在調(diào)試時,用條件編譯的方式將debug語句加入;在修改Bug時候,用條件編譯方式引入新的修正,并保留原來的程序;1.3文件包含頭文件包含#include“xxxx.h”含義是在編譯時將頭文件的內(nèi)容加入到包含文件中。頭文件包含的方式#include“xxxx.h”到本級目錄去找。#include<xxxx.h>到系統(tǒng)默認(rèn)目錄和本級目錄去找。重復(fù)包含(重復(fù)定義)由于頭文件包含可以嵌套,那么C文件就有可能包含多次同一個頭文件,就可能出現(xiàn)重復(fù)定義的問題的通過條件編譯開關(guān)來避免重復(fù)包含(重復(fù)定義)例如#ifndef__headerfileXXX__

#define__headerfileXXX__

…文件內(nèi)容

…#endif2.1位操作(1)基本位操作符<<,>>如(0x01)<<4=0x10;(0x80)>>4=0x08位操作應(yīng)用舉例乘法、除法,例如a*8可以寫成a<<3;地址計算,例如一個32位的地址裝在元素類型是char的數(shù)組a[4]中(假設(shè)按照從低到高存放),那么計算這個地址的方法為((a[3]<<24)|(a[2]<<16)|(a[1]<<8)|a[0]容易出現(xiàn)的問題盡量使用無符號變量,避免產(chǎn)生符號錯誤;注意避免發(fā)生數(shù)據(jù)溢出;2.1位操作(2)位運(yùn)算符例子分析請分析下面問題的含義。

#typedefunsignedchar

UINT1

#typedefunsignedshort

UINT2

#typedefunsignedlong

UINT4問題1:

#define

MC_GET_CHAR(__data__)

\ (*((UINT1*)(__data__))) 問題2: #defineMC_GET_SHORT(__data__)\ ((UINT2)((((UINT2)(*((UINT1*)(__data__))))<<8)\ |((UINT2)(*((UINT1*)(__data__)+1)))&0x00ff)))2.1位操作(3) 問題3:

#define

MC_GET_LONG(__data__)

\ ((((UINT4)MC_GET_SHORT((__data__)))<<16)\ |(((UINT4)MC_GET_SHORT(__data__+2))&0x0000ffff)) 問題4:

#defineMC_GET_3BN(__data__)

\ ((((UINT4)MC_GET_CHAR((__data__)))<<16)\ |(((UINT4)MC_GET_SHORT(__data__+1))&

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論