2010-11-21 24 views
17

其中一些預處理器定義位於WinMain函數和其他Windows庫函數中。他們的目的是什麼?他們如何工作?將它們寫入你的實現或函數調用是一個好習慣嗎?__in __out __in_opt __allowed()的用途是什麼,它們是如何工作的?我應該在自己的代碼中使用類似的結構嗎?

我的初步研究表明,他們只是簡單地設置equlivalent到:

#define __in 
#define __out 
#define __in_opt 

這意味着他們得到與預處理器通什麼取代。他們只是一個文檔方法,沒有任何功能?

如果是這樣,我可以看到像這樣記錄代碼的好處。有了像doxygen這樣的東西,你需要寫出兩次參數名稱。所以這在理論上可以幫助減少重複,並保持一致性...

我對__allowed()應該如何工作沒有理論。

回答

23

它們是源代碼註釋語言中的SAL註釋。微軟工具取決於它。 MSDN Library文章is here。一個很好的例子是Code Analysis。另一個非常不相關的工具,但由這些註釋授權的是Pinvoke Interop Assistant。

+0

當工具依賴於不可靠和不正確的信息時,這不是一個問題嗎? – 2010-11-21 20:16:11

+0

當依賴不正確的信息時,這總是一個問題。 SAL註釋也不例外。這當然有點冒險,但這是C的聲明/定義架構固有的 - 你總是要確保它們匹配。 – MSalters 2010-11-22 10:29:21

+0

@Cheers通過代碼分析爲調用者和被調用者檢查SAL註釋。註釋不僅表達作者的意圖,而且也被驗證(在可能的情況下)。因此,他們既不可靠也不正確。考慮'void foo(_In_opt_ int * p){* p = 42; }'。參數'p'被標記爲可選的,但是實現假定它總是有效的。代碼分析將識別問題並提供診斷信息。 – IInspectable 2013-07-13 12:14:38

-2

這些微軟的宏通常擴展到沒有任何東西,並且意味着給讀者一些提示。

但是,上次我檢查了例如提示MessageBox參數是完全錯誤的,暗示第一,第二和第三個參數具有有用的默認值(當您指定0時),而實際上它是第一個和第四個參數,它們具有有用的默認值。也許標題參數默認爲「錯誤」,但我從未發現有用。所以,這只是微軟的一件事,暗示你不能也不應該依賴,只是誤導視覺混亂。

乾杯&心連心,

5

他們在Microsoft語義分析工具,因爲代碼標記使用。除非你打算自己使用這個工具,否則使用它們的目的很少。

9

SAL註釋是有用的兩件事情:

    通過的PREfast(與編譯/分析)
  • 人類的讀者可以看看註釋,並找出一個功能應該如何被調用,並快速
  • 靜態分析確定輸入/輸出參數。

當您的代碼在分析上編譯時,宏實際上會擴展爲各種declspec表達式。我在代碼中始終使用這些註釋。

相關問題