提示檔案
A 提示檔案 可以幫助 Visual Studio 整合式的開發環境 (IDE) 會解譯 Visual C++ 識別項,例如函式和巨集的名稱。當您開啟 Visual C++ 的專案,IDE 的 分析系統 會在專案中每個原始程式檔中的程式碼分析,蒐集每個識別項的相關資訊。然後 IDE 會使用這項資訊來支援功能,例如 類別檢視 瀏覽器和 導覽列.
剖析的系統中引入 Visual C++ 2010了解 C/c + + 語法,但可以錯誤解譯含有巨集的陳述式。如果巨集造成原始程式碼所寫的語法不正確,可能是 1931 或陳述式。原始程式碼會編譯,並且 preprocesser 會取代時,該陳述式可能會語法正確 巨集識別項 與它的定義。 剖析的系統的運作方式而不需要建置專案,因為會使用來解譯巨集的提示檔案。 因此,例如瀏覽功能 類別檢視 立即使用。
提示檔案包含使用者自訂 提示其中具有相同的語法與 C/c + + 的巨集定義。Visual C++ 包含內建的提示檔案的已足夠完成大多數的專案,但是您可以建立您自己的提示檔案,以改善 Visual Studio 處理識別項的方式。
分析藍本
假設下列程式碼是在您檢查與原始程式檔 類別檢視 瀏覽器。[ STDMETHOD 巨集宣告名為的方法 myMethod 接受一個參數,並傳回變數的指標, HRESULT.
// Source code file.
STDMETHOD(myMethod)(int parameter1);
下列巨集定義是以不同的標頭檔。
// Header file.
#define STDMETHOD(method) HRESULT (STDMETHODCALLTYPE * method)
#define STDMETHODCALLTYPE __stdcall
#define HRESULT void*
剖析的系統無法解譯原始程式檔,因為名稱為 STDMETHOD 的函式進行宣告,以及該宣告是語法不正確的因為它有兩個參數清單。剖析的系統不會開啟探索的定義的標頭檔 STDMETHOD, STDMETHODCALLTYPE並 HRESULT 巨集。因為無法解譯剖析的系統 STDMETHOD 巨集],它會略過整個陳述式,接著會繼續剖析。
剖析的系統並不會使用標頭檔,因為您的專案可能會需要使用一或多個重要的標頭檔。如果任何標頭檔有所變更,可能需要重新檢查您的專案,這不但會降低效能的 IDE 中的標頭檔的所有剖析的系統。相反地,剖析系統會使用指定的處理方式的提示 STDMETHOD, STDMETHODCALLTYPE並 HRESULT 巨集。
您是否知道您需要一個提示?而且如果您需要一個提示,何種型式應該建立嗎?提示所需的一個符號如果識別項中的檢視 類別檢視 與 [] 檢視中不一致 編輯器.比方說, 類別檢視 可能會顯示您所知的類別成員存在或成員的名稱不正確。如需有關解決常見的問題的提示之類型的詳細資訊,請參閱什麼巨集需要 A 提示?本主題稍後的章節。
架構
提示檔案與相關的實體目錄、 非邏輯的目錄中所示 方案總管] 中.您沒有將提示檔案加入至專案,以提示檔案產生效果。只有在剖析原始程式檔時,剖析系統會使用提示檔案。
每個提示檔名為 cpp.hint.因此,多個目錄可以包含提示檔案,但是只能有一個提示檔案可能會發生在特定目錄。
您的專案可能會影響由零個或多個提示檔案中。如果沒有提示檔案,剖析系統會使用錯誤修復技術來略過無法解讀的原始程式碼。否則,剖析系統會使用下列的策略,才能找到且收集提示。
搜尋順序
剖析系統會以下列順序搜尋的提示檔案的目錄。
包含 Visual C++ (安裝套件的目錄vcpackages).此目錄包含如描述常用的系統檔中符號的內建的提示檔案 windows.h.因此,您的專案就會自動繼承大部分的所需的提示。
從原始程式檔的根目錄到包含本身的原始程式檔的目錄的路徑。在典型的 Visual C++ 的專案,根目錄會包含方案或專案檔。
這項規則的例外是如果 停止檔案 是在原始程式檔的路徑。停止檔案可讓您搜尋順序的其他控制,而且名為 [任何檔案 cpp.stop.而非從根目錄開始,剖析系統會搜尋包含原始程式檔所在目錄的停駐點檔案的目錄中。在典型的專案中,您不需要的停駐點的檔案。
提示蒐集
提示檔案包含零或更大 提示.提示是定義或刪除,就像 C/c + + 巨集。亦即, #define 前置處理器指示詞會建立,或重新定義一項提示,以及 #undef 指示詞中刪除一個提示。
剖析系統每個提示檔案中開啟搜尋順序稍早所述,累積成一組的每個檔案的提示 有效的提示然後再來解譯您的程式碼中的識別項使用有效的提示。
剖析系統會使用下列規則來累積提示。
如果新的提示指定未定義的名稱,則新的提示會將名稱加入有效的提示。
如果新的提示中指定一個已定義的名稱,新的提示來重新定義現有的提示。
如果是新的提示 #undef 指示詞,指定現有的有效提示、 新的提示會刪除現有的提示。
第一個規則表示有效的提示繼承自先前開啟的提示檔。最後兩項規則意味著稍後會在搜尋順序的提示,可以覆寫先前發生的提示。比方說,您可以覆蓋任何先前的提示,如果您建立提示檔案中包含原始程式檔的目錄。
如表述來描述的方式提示所蒐集,請參閱 範例 本主題稍後的章節。
語法
建立和刪除可建立及刪除巨集的前置處理器指示詞與相同的語法與提示。事實上,剖析系統會使用 C/c + + 前置處理器來評估的提示。如需有關前置處理器指示詞的詳細資訊,請參閱 #define 指示詞 (C/C++) 以及 #undef 指示詞 (C/C++).
只有不尋常的語法項目 @<, @=並 @> 取代字串。這些是僅所使用的提示檔案特定的取代字串 地圖 巨集。對應是一組與其他的資料、 函數或事件處理常式產生關聯的資料、 函數或事件的巨集。比方說, MFC 若要建立使用對應 訊息對應並 ATL 若要建立使用對應 物件對應.提示檔案特定的取代字串指出對應的開始、 中級、 和結束的項目。只有對應巨集的名稱很重要的。因此,每個替換字串故意隱藏巨集的實作。
提示請使用下列語法。
語法 |
意義 |
---|---|
#define提示名稱取代字串 #define提示名稱(參數, ...)取代字串 |
Preprocesser 指示詞定義新的提示,或重新定義現有的提示。指示詞,後面前置處理器會取代目的所在位置 提示名稱 在與原始碼 取代字串. 第二種語法形式定義類似函式的提示。如果在原始程式碼中,就會發生類似函式的提示,前置處理器的第一個將會取代目的所在位置 參數 在 取代字串 在 [原始碼],然後按一下 [取代對應的引數 提示名稱 使用 取代字串. |
@< |
提示檔案特定的 取代字串 代表一組對應項目開頭的。 |
@= |
提示檔案特定的 取代字串 表示中繼的對應項目。對應可以有多個對應項目。 |
@> |
提示檔案特定的 取代字串 表示一組對應項目結尾。 |
#undef提示名稱 |
前置處理器指示詞會刪除現有的提示。提示的名稱由 提示名稱 識別項。 |
//註解 |
單行註解。 |
/*註解*/ |
多行註解。 |
什麼巨集需要提示嗎?
某些類型的巨集可能會干擾剖析的系統。本章節說明的巨集可能會造成問題,型別,並提示才能解決該問題,您可以建立的型別。
破壞性的巨集
有些巨集會導致剖析錯誤解譯原始程式碼、 系統,但可略過不損害您的瀏覽經驗。比方說,[原始程式碼附註語言 (SAL) 解析成 c + + 屬性,可協助您發現程式撰寫錯誤的巨集。如果您想要忽略 SAL 附註您瀏覽程式碼時,您可能要建立會隱藏附註的提示檔案。
在 [下列原始程式碼中,參數輸入 FormatWindowClassName() 函式 PXSTR且參數名稱為 szBuffer.不過,剖析的系統錯誤 _Pre_notnull_ 以及 _Post_z_ 參數型別或參數名稱的 SAL 附註。
原始碼:
靜態 void FormatWindowClassName(_Pre_notnull_ _Post_z_ PXSTR) szBuffer
策略: 空值的定義
在此情況下的策略是將其視為的 SAL 附註,彷彿並不存在。若要這樣做,請指定其取代字串是空值的提示。因此,剖析系統會忽略註解,以及 類別檢視 瀏覽器不會顯示它們。(Visual C++ 包括隱藏的 SAL 附註的內建的提示檔案)。
提示檔案:
#define _Pre_notnull_
隱藏的 C/c + + 語言項目
剖析系統 misinterprets 來源程式碼的常見原因,是如果巨集就會隱藏 C/c + + 標點符號 或 關鍵字 語彙基元。也就是巨集可能包含半個是成對的標點符號如 <>, [], {}並 ().
在下列原始程式碼, START_NAMESPACE 巨集會隱藏 unpaired 的左大括號 ({).
原始碼:
#define START_NAMESPACE MyProject 的命名空間 {
策略: 直接複製
如果巨集的語意都不可或缺的瀏覽習慣,建立一個完全相同的巨集的提示。剖析的系統會解析成提示檔案中定義的巨集。
請注意是否原始程式檔中的巨集包含其他的巨集,這些巨集解譯它們已在集中的有效的提示時,才。
提示檔案:
#define START_NAMESPACE MyProject 的命名空間 {
地圖
對應是由巨集,以指定起始的項目、 結束的項目,以及零個或多個中繼元素所組成。剖析系統 misinterprets 對應,因為每一個的對應巨集會隱藏 C/c + + 語言項目,而完整的 C/c + + 陳述式的語法會分配給很多不同的巨集。
下列程式碼定義 BEGIN_CATEGORY_MAP, IMPLEMENTED_CATEGORY並 END_CATEGORY_MAP 巨集。
原始碼:
#define BEGIN_CATEGORY_MAP(x)\
static const struct ATL::_ATL_CATMAP_ENTRY* GetCategoryMap() throw() {\
static const struct ATL::_ATL_CATMAP_ENTRY pMap[] = {
#define IMPLEMENTED_CATEGORY( catid ) { _ATL_CATMAP_ENTRY_IMPLEMENTED, &catid },
#define END_CATEGORY_MAP()\
{ _ATL_CATMAP_ENTRY_END, NULL } };\
return( pMap ); }
策略: 找出對應的項目
指定提示的開始時間、 中間 (如果有的話) 和結束的對應項目。使用特殊的地圖取代字串 @<, @=並 @>.如需詳細資訊,請參閱 語法 本主題中的區段。
提示檔案:
// Start of the map.
#define BEGIN_CATEGORY_MAP(x) @<
// Intermediate map element.
#define IMPLEMENTED_CATEGORY( catid ) @=
// Intermediate map element.
#define REQUIRED_CATEGORY( catid ) @=
// End of the map.
#define END_CATEGORY_MAP() @>
複合的巨集
複合的巨集包含一或多個混淆剖析系統巨集的型別。
下列程式碼包含 START_NAMESPACE 巨集],以指定的命名空間範圍開始,並 BEGIN_CATEGORY_MAP [巨集],指定對應的開始。
原始碼:
#define NSandMAP START_NAMESPACE BEGIN_CATEGORY_MAP
策略: 直接複製
建立提示 START_NAMESPACE 以及 BEGIN_CATEGORY_MAP 巨集],然後建立的提示 NSandMAP 如先前所示的原始程式檔相同的巨集。或者,如果複合的巨集是由只有破壞性的巨集和泛空白字元所組成,您可以定義的取代字串是空值定義一個提示。
在這個範例中,假設 START_NAMESPACE 已經有一個提示,如本主題中所述 隱藏的 C/c + + 語言項目 子標題。而假設 BEGIN_CATEGORY_MAP 還有一個提示,如稍早介紹 地圖.
提示檔案:
#define NSandMAP START_NAMESPACE BEGIN_CATEGORY_MAP
不太方便的巨集
有些巨集可解譯剖析的系統,但原始程式檔並不容易閱讀,因為此巨集了長或太複雜。為了方便閱讀,您可以提供一個提示,簡化了巨集的顯示方式。
原始碼:
#define STDMETHOD(methodName) HRESULT (STDMETHODCALLTYPE * methodName)
策略: 簡化
建立一個提示,顯示較簡單的巨集定義。
提示檔案:
#define STDMETHOD(methodName) void* methodName
範例
下列範例說明如何提示就會累積提示檔案中。在本例中,不會使用停駐點的檔案。
下圖說明某些 Visual C++ 的專案中的實體目錄。提示檔案是位在 vcpackages, 偵錯, A1並 A2 目錄搜尋。
提示檔案目錄
目錄和提示檔案內容
下表列出此專案中包含提示檔案及目錄提示檔案的內容。只要為一些中許多的提示 vcpackages 列出目錄提示檔案。
目錄 |
提示檔案內容 |
---|---|
vcpackages |
|
偵錯 |
|
A1 |
|
A2 |
|
有效的提示
下表列出為此專案中的原始程式檔的有效的提示。
原始程式檔 |
有效的提示 |
---|---|
A1_A2_B.cpp |
|
下列提示套先前的表格。
有效的提示是來自 vcpackages, 偵錯, A1並 A2 目錄搜尋。
[ #undef 在指示詞 偵錯 提示檔案中移除 #define _In_ 在提示 vcpackages 目錄提示檔案。
提示檔案中的 A1 目錄重新定義 START_NAMESPACE.
[ #undef 在提示 A2 目錄中移除的提示 OBRACE 以及 CBRACE 在 偵錯 目錄提示檔案。