windef.h中第一行寫到: #ifndef _WINDEF_ #define _WINDEF_ 意思是說如果沒定義_WINDEF_,則定義_WINDEF_ 我翻了一下C語言的書,76頁,寫到: 宏定義的形式如下: #define 名字>>替換文本 可上句中的#define _WINDEF_,名稱有了,替換文本是什么呢?是空白嗎? 這樣做的目的是什么呢? 另外: _cdecl __stdcall 是什么? 再另外這是什么意思? #ifdef STRICT typedef void NEAR* HGDIOBJ; #else DECLARE_HANDLE(HGDIOBJ); #endif 不好意思,問了這么多菜問題。謝謝各位 _cdecl 按從右至左的順序壓參數(shù)入棧,由調(diào)用者把參數(shù)彈出棧。對于“C”函數(shù)或者變量,修飾名是在函數(shù)名前加下劃線。對于“C++”函數(shù),有所不同。 如函數(shù)void test(void)的修飾名是_test;對于不屬于一個類的“C++”全局函數(shù),修飾名是?test@@ZAXXZ。 這是MFC缺省調(diào)用約定。由于是調(diào)用者負責把參數(shù)彈出棧,所以可以給函數(shù)定義個數(shù)不定的參數(shù),如printf函數(shù)。 _stdcall 按從右至左的順序壓參數(shù)入棧,由被調(diào)用者把參數(shù)彈出棧。對于“C”函數(shù)或者變量,修飾名以下劃線為前綴,然后是函數(shù)名,然后是符號“@”及參數(shù)的字節(jié)數(shù),如函數(shù)int func(int a, double b)的修飾名是_func@12。對于“C++”函數(shù),則有所不同。 看看http://dev.csdn.net/develop/article/19/19460.shtm 順便學習! #ifndef identifier your code #endif 如果identifier為一個未定義的符號,your code就會被編譯,否則剔除 #ifdef identifier your code1 #else your code2 #endif 如果identifier為一個定義了的符號,your code1就會被編譯,否則your code2就會被編譯 #define 名字>>替換文本 只是一種用法 如果不關(guān)心名字用什么東西替換,而只關(guān)心名字是否定義了的話,就直接使用 #define 名字 就行了 我可能沒說明白我的第三個問題 我其實想問的是 typedef void NEAR* HGDIOBJ;是將哪個定義成哪個了? 一般情況是typedef 類型>>別名。上句中類型是什么?別名是什么?為什么有三個表達式 DECLARE_HANDLE(HGDIOBJ);是什么意思? 第一個問題怎么沒人解釋?謝謝 arrowcy(長弓手) “#define 名字”的目的是什么?又做了什么?還是什么也不做?假如我在程序中用了“名字”,那么會被替換嗎? 如果我不用的話,只是定義了有什么意義? 在DOS下,所有地址都可以表示為“段:段內(nèi)偏移量”的方式,即XXXX:XXXX。如果在段內(nèi)部進行操作使用near指針,即段采用當前的數(shù)據(jù)段,而指針地址為段內(nèi)偏移量,這樣通常更快些,但是所能表示的地址范圍有限。為了表示更廣的范圍,可以使用far*(遠指針),就是不管當前的數(shù)據(jù)段是什么,采用XXXX:XXXX的方式指明地址。 #define DECLARE_HANDLE(name) struct name##__ { int unused; }; typedef struct name##__ *name 呵呵,我不是說了嗎? #ifndef identifier your code #endif 如果identifier為一個未定義的符號,your code就會被編譯,否則剔除 而這里的your code就是 #define _WINDEF_ ...//那個類的頭文件其他的代碼,你一定沒有注意那個頭的最后一行有#endif 是用來防止重復包含的,如果定義了_WINDEF_哪后面代碼(頭文件里面的其他的代碼,)就不會被編譯 typedef void NEAR* HGDIOBJ;是將哪個定義成哪個了? typedef是用來定義新的整數(shù)類型 將HGDIOBJ定義為void NEAR* 明白點兒了,雖然沒全懂,呵。我再消化消化,謝謝各位!! |
|