函數格式請教。 |
答題得分者是:miyu
|
jrchi
一般會員 發表:5 回覆:3 積分:1 註冊:2003-07-07 發送簡訊給我 |
最近在觀看別人所寫的程式碼中,發現了下列兩個函數的開頭,與我們一般常見的不同,所以想要請教各位大大幫我解開疑或,謝謝。
第一個:
long MFTYPE DisplayErrorExt(long HookType, MIL_ID EventId, void MPTYPE *UserDataPtr)
{
return M_NULL;
} 第二個:
DWORD WINAPI MainCtrlThread(LPVOID arglist)
{
程式內碼
}
想請教的是為何要如此宣告。
在此先謝謝各位先進的講解。 多多指教
------
多多指教 |
miyu
中階會員 發表:13 回覆:96 積分:91 註冊:2003-05-01 發送簡訊給我 |
引言: 最近在觀看別人所寫的程式碼中,發現了下列兩個函數的開頭,與我們一般常見的不同,所以想要請教各位大大幫我解開疑或,謝謝。 第一個: long MFTYPE DisplayErrorExt(long HookType, MIL_ID EventId, void MPTYPE *UserDataPtr) { return M_NULL; } 第二個: DWORD WINAPI MainCtrlThread(LPVOID arglist) { 程式內碼 } 想請教的是為何要如此宣告。 在此先謝謝各位先進的講解。 多多指教第一個你去看對方的程式, 找看看有沒有定義. 抱歉我不記得有這個 #define 第二個是 Windows SDK 裡的定義, 用來表示 calling convention. __stdcall 為win32 API 的標準calling convention 請看 windef.h : #ifdef _MAC #define WINAPI CDECL #elif (_MSC_VER >= 800) || defined(_STDCALL_SUPPORTED) #define WINAPI __stdcall #else #define WINAPI #endif 常見的 calling convention 與用途: __cdecl, 參數從右到左傳, 呼叫者清理stack, 此為 c/c standard calling convention __pascal, 參數從左到右傳, function clear stack, 此為 pascal standard calling convention __stdcall, 參數從右到左傳, function clear stack, 此為 Win32 API standard calling convention __fastcall, 前兩個參數由ECX, EDX傳, 其他的參數從右到左傳, function clear stack, 此為 BCB standard calling convention |
jrchi
一般會員 發表:5 回覆:3 積分:1 註冊:2003-07-07 發送簡訊給我 |
|
miyu
中階會員 發表:13 回覆:96 積分:91 註冊:2003-05-01 發送簡訊給我 |
引言: 感謝miyu大大的援救,讓小弟我又長了一個知識; 又我在程式中又看到了下列的格式: IDCtrl::IDCtrl():IDX_Data(ID_X_JOG_SPD_L),IDY_Data(,ID_Y_JOG_SPD_L) {………} "IDCtrl::IDCtrl():IDX_Data,IDY_Data" 我知道這樣的格式為IDCtrl是繼承IDX_Data與IDY_Data,而上面的格式想請問各位大大幫忙說明一下; 謝謝各位大大的幫忙。 多多指教你確定沒打錯字嗎? 這段code看起來, '很像是' constructor. 你也可以這樣寫: IDCtrl::IDCtrl() : IDX_Data(ID_X_JOG_SPD_L), IDY_Data(,ID_Y_JOG_SPD_L) //^^^?? 這裡真的沒打錯? { ... }一般說來, 當你的constructor起始建構一個object的時候, 你最好是要把這個class的所member都作初始化, 賦予它們一個已知的值, 除非你有特別的理由. 上面那種寫法被稱為 member initialization list. 當然, 一般情況下你也可以用下面這種寫法取代: IDCtrl::IDCtrl() { IDX_Data = ID_X_JOG_SPD_L; IDY_Data = ID_Y_JOG_SPD_L; ... }但是呢, 你心中是不是出現了question mark? 是的, 這兩種作法的確是有差異. 首先呢, 如果你的class member被宣告為 const, 那你就一定得用 member initialization list 去作初始化的動作: class BookItem { public: BookItem(const std::string& BookName); private: const std::string Name; };在這種case, 由於 Name 被宣告為 const, 所以你寫下面這段code, 會當場被compiler打回票: BookItem::BookItem(const std::string& BookName) { Name = BookName; }compiler應該會告訴你, const object無法被改變一類的訊息才是. (不會? 那...把那套compiler丟到垃圾桶) 你別無選擇的只能這樣寫: BookItem::BookItem(const std::string& BookName) : Name(BookName) { // 空 }根據 C 規定, const members 只能被初始化, 不能被assign value. 另外一個我目前想得到的理由是, 速度. 如果你在 constructor 中寫 Name = BookName; 那麼, class 建構的成本是: 1. 呼叫 string 的預設 constructor, 為 Name 建構一個空字串. 2. 接下來, 執行 Name = BookName, 這會促使compiler為你呼叫 Name 的 operator= function, 以便把 BookName 的內容assign到 Name中. 如果你始用 member initialization list去作: ( : Name(BookName) 的寫法), 那麼, 成本是: 1. compiler 為你呼叫起 Name 的 copy constructor, 將 BookName 丟進去當參數以初始化 str::string Name 顯而易見的成本付出. 發表人 - miyu 於 2003/08/16 03:01:56 |
miyu
中階會員 發表:13 回覆:96 積分:91 註冊:2003-05-01 發送簡訊給我 |
|
jrchi
一般會員 發表:5 回覆:3 積分:1 註冊:2003-07-07 發送簡訊給我 |
|
miyu
中階會員 發表:13 回覆:96 積分:91 註冊:2003-05-01 發送簡訊給我 |
引言: "IDCtrl::IDCtrl():IDX_Data,IDY_Data" 我知道這樣的格式為IDCtrl是繼承IDX_Data與IDY_Data,而上面的格式想請問各位大大幫忙說明一下;忘了吐嘈, 這樣不是繼承 class TBase { int a; }; class TBase2 { int b; }; class TClass : public TBase, private TBase2 { };這種寫法才是繼承 發表人 - miyu 於 2003/08/16 15:43:54 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |