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

關於Win32 API Function裡常見的IN、OUT修飾字

答題得分者是:aftcast
acmaeiou
一般會員


發表:4
回覆:9
積分:2
註冊:2010-06-18

發送簡訊給我
#1 引用回覆 回覆 發表時間:2010-10-20 00:17:39 IP:122.116.xxx.xxx 未訂閱
各位前輩們好,小弟有個問題:

就是一般在Win32 API的Function裡面,常常會見到"IN"、跟"OUT"的修飾字,舉例如下:

[code cpp]
int recv(
  __in   SOCKET s,
  __out  char *buf,
  __in   int len,
  __in   int flags
);
[/code]    小弟一直找不到正式的官方說明,根據自己的理解整理出一套說法,請各位前輩看看是否有不對的地方。    前面有IN的表示這個參數做為輸入用,不管是call value還是call by address,這個Function不會去動到它的值
前面有OUT的表示這個Function會把結果寫入此變數,所以這個變數不會有call by value的情況發生
前面IN OUT都有的表示這個參數既是輸入用,而且又當成輸出結果用,所以也不會有call by value的情況    以上是小弟到目前為止的理解,請各位前輩們指正..........    

aftcast
站務副站長


發表:81
回覆:1482
積分:1762
註冊:2002-11-21

發送簡訊給我
#2 引用回覆 回覆 發表時間:2010-10-20 01:21:58 IP:220.135.xxx.xxx 訂閱
你好,事情沒有你想的那麼複雜。

首先,可以參考一下官網

http://msdn.microsoft.com/en-us/library/aa383701.aspx

此外,我的看法(應該也是官方的說法),它只是用來表示或說註解該參數是需要被傳入(in)或是需要被寫入(out),或是需要被傳入然後再寫入送出來。
這不關於call by value 或是 address 的問題。

到底值會不會被改,完全取決於基本原理,即,傳指標,或是傳一般數值代表call by address 或 call by value。這個基本原理是c/c 的基礎課程。此與__in或__out等完全沒有對應的絕對關係。

簡單講就是:
1/ __in 或 __out 這類的macro,應該把它當作是一種提示開發人員或某些分析工具用的一種註解,其實不重要!
2/ 到底是by value 或是 by address,完全取決於 指標 或是 參考 或是 一般數值 的參數。與上述的第一點完全無關,也沒影射的關連!


當然,可想而知的一件事… __out 的參數通常會被改變(因為要out嘛,很直覺的),而__in的部份,則是要關切要輸入必要的正確值才可以使function正常,不能亂傳一個數(這也很直覺吧?!),其實一切就是那麼直覺,只是一種註解給程式人員看而已!



註: 其實C語言是沒有真的CALL BY ADDRESS。僅有CALL BY VALUE。傳指標其實也是一種傳VALUE。直到C ,有參考型別後,若參數是參考,這才可以正確的說是一種CALL BY ADDRESS…詳情說來有點複雜。若有機會你可以去深入了解… (或者不用去管這些名詞,以免更亂) :P
------



蕭沖
--All ideas are worthless unless implemented--

C++ Builder Delphi Taiwan G+ 社群
http://bit.ly/cbtaiwan
編輯記錄
aftcast 重新編輯於 2010-10-19 11:30:16, 註解 無‧
acmaeiou
一般會員


發表:4
回覆:9
積分:2
註冊:2010-06-18

發送簡訊給我
#3 引用回覆 回覆 發表時間:2010-10-20 15:52:57 IP:114.32.xxx.xxx 未訂閱
感謝前輩的參考資料及說明,小弟獲益良多
系統時間:2017-12-13 13:37:47
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!