今天看到inet_ntoa函數(shù)的原型,這個(gè)返回類型實(shí)在是沒見過:
char FAR* PASCAL FAR inet_ntoa(struct in_addr in);
搜索了一下:
1.關(guān)于FAR:(來自http://blog.csdn.NET/sphone89/article/details/7184976)
FAR 是16位系統(tǒng)時(shí)候的概念了,代表遠(yuǎn)指針的意思。
近指針是16位的指針,它只表示段內(nèi)的偏移地址,因而只能對(duì)64k字節(jié)數(shù)據(jù)段內(nèi)地址進(jìn)行存取。
如 char near *p;
p=(char near *)0xffff;
遠(yuǎn)指針是32位指針,它表示段地址:偏移地址,如定義遠(yuǎn)程指針p指向B500段的2號(hào)地址,即B500:0002,則可寫作:
char far *p;
p=(char far *)0xB5000002;
因此,遠(yuǎn)指針可以進(jìn)行跨段尋址,可以訪問整個(gè)內(nèi)存的地址。
16位系統(tǒng)有遠(yuǎn)近指針之分的環(huán)境中,得告訴編譯器指針變量h_name強(qiáng)制使用遠(yuǎn)指針方式。因?yàn)?6位系統(tǒng)尋址范圍只有2^16=64K,所以用FAR指針,再加上16位,高16位存放的是變量的段地址,低16位存放變量的段內(nèi)偏移。
2.關(guān)于PASCAL(來自http://bbs.csdn.net/topics/333630中的回復(fù))關(guān)于__stdcall和_cdecl(提到PASCAL)這兩個(gè)關(guān)鍵字看起來似乎很少和我們打交道,但是看了下面的定義(來自windef.h),你一定會(huì)覺得驚訝: #define CALLBACK __stdcall #define WINAPI __stdcall #define WINAPIV __cdecl #define APIENTRY WINAPI #define APipRIVATE __stdcall #define PASCAL __stdcall #define cdecl _cdecl #ifndef CDECL #define CDECL _cdecl #endif 幾乎我們寫的每一個(gè)WINDOWS API函數(shù)都是__stdcall類型的,為什么?? 首先,我們談一下兩者之間的區(qū)別: WINDOWS的函數(shù)調(diào)用時(shí)需要用到棧(STACK,一種先入后出的存儲(chǔ)結(jié)構(gòu))。當(dāng)函數(shù)調(diào)用完成后,棧需要清楚,這里就是問題的關(guān)鍵,如何清除?? 如果我們的函數(shù)使用了_cdecl,那么棧的清除工作是由調(diào)用者,用COM的術(shù)語來講就是客戶來完成的。這樣帶來了一個(gè)棘手的問題,不同的編譯器產(chǎn)生棧的方式不盡相同,那么調(diào)用者能否正常的完成清除工作呢?答案是不能。 如果使用__stdcall,上面的問題就解決了,函數(shù)自己解決清除工作。所以,在跨(開發(fā))平臺(tái)的調(diào)用中,我們都使用__stdcall(雖然有時(shí)是以WINAPI的樣子出現(xiàn))。 那么為什么還需要_cdecl呢?當(dāng)我們遇到這樣的函數(shù)如fPRintf()它的參數(shù)是可變的,不定長(zhǎng)的,被調(diào)用者事先無法知道參數(shù)的長(zhǎng)度,事后的清除工作也無法正常的進(jìn)行,因此,這種情況我們只能使用_cdecl。 到這里我們有一個(gè)結(jié)論,如果你的程序中沒有涉及可變參數(shù),最好使用__stdcall關(guān)鍵字
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注