關於Win32 API Function裡常見的IN、OUT修飾字 |
答題得分者是:aftcast
|
acmaeiou
一般會員 ![]() ![]() 發表:4 回覆:9 積分:2 註冊:2010-06-18 發送簡訊給我 |
各位前輩們好,小弟有個問題:
就是一般在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 回覆:1485 積分:1763 註冊:2002-11-21 發送簡訊給我 |
你好,事情沒有你想的那麼複雜。
首先,可以參考一下官網 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 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |