全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:974
推到 Plurk!
推到 Facebook!

函數格式請教。

答題得分者是:miyu
jrchi
一般會員


發表:5
回覆:3
積分:1
註冊:2003-07-07

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-08-11 22:53:09 IP:61.224.xxx.xxx 未訂閱
最近在觀看別人所寫的程式碼中,發現了下列兩個函數的開頭,與我們一般常見的不同,所以想要請教各位大大幫我解開疑或,謝謝。 第一個: 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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-08-11 23:46:13 IP:61.217.xxx.xxx 未訂閱
引言: 最近在觀看別人所寫的程式碼中,發現了下列兩個函數的開頭,與我們一般常見的不同,所以想要請教各位大大幫我解開疑或,謝謝。 第一個: 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

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-08-16 02:00:24 IP:218.160.xxx.xxx 未訂閱
感謝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,而上面的格式想請問各位大大幫忙說明一下; 謝謝各位大大的幫忙。 多多指教
------
多多指教
miyu
中階會員


發表:13
回覆:96
積分:91
註冊:2003-05-01

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-08-16 02:57:19 IP:61.217.xxx.xxx 未訂閱
引言: 感謝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

發送簡訊給我
#5 引用回覆 回覆 發表時間:2003-08-16 02:59:24 IP:61.217.xxx.xxx 未訂閱
引言: 感謝miyu大大的援救,讓小弟我又長了一個知識;
dirty job多作一點, 你就會很熟calling convention了 XD
jrchi
一般會員


發表:5
回覆:3
積分:1
註冊:2003-07-07

發送簡訊給我
#6 引用回覆 回覆 發表時間:2003-08-16 03:59:24 IP:218.160.xxx.xxx 未訂閱
再次感謝 miyu 大大的回答, 先在此說聲抱歉,那段程式碼小弟我複製時忘記將","刪掉了,真是不好意思。而經由 miyu 大大的回答,小弟心中的問題已得到了最好的解決。 多多指教
------
多多指教
miyu
中階會員


發表:13
回覆:96
積分:91
註冊:2003-05-01

發送簡訊給我
#7 引用回覆 回覆 發表時間:2003-08-16 15:40:34 IP:61.217.xxx.xxx 未訂閱
引言: "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
系統時間:2024-06-29 5:18:09
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!