Aracılığıyla paylaş


İpucu dosya

A İpucu dosya yardımcı olan Visual Studio tümleşik geliştirme ortamı (IDE) işlevleri ve makro adları gibi Visual C++ tanımlayıcıları yorumlamak.Bir Visual C++ projesinin, IDE açtığınızda Ayrıştırma sistemi projede her kaynak dosyasındaki kod analiz eder ve her bir tanımlayıcı hakkında bilgi toplar.IDE gibi özellikleri desteklemek için bu bilgileri kullanır. Sınıf Görünümü Tarayıcı ve Gezinti çubuğu.

' De sunulan ayrıştırma sistemi Visual C++ 2010, C/C++ sözdizimi anlar ancak makro içeren bir ifade hatalı yorumlayan.Makro yazılan sözdizimi kurallarına göre yanlış olması için kaynak kodu neden olursa deyim yanlış anlaşılabilir.Kaynak kodu derlenir ve preprocesser yerini almıştır ifade sözdizimi olarak doğru olabilir Makro tanımlayıcısı kendi tanımlama. Makrolar yorumlamak için ipucu dosyaları kullandığı için projeyi oluşturmak zorunda kalmadan ayrıştırma sistemi çalışır. Bu nedenle, bir tarama özelliği gibi Sınıf Görünümü hemen kullanılabilir.

Bir ipucu dosyası kullanıcı tarafından özelleştirilebilir içerir ipuçları, C/C++ makro tanımları ile aynı söz dizimini vardır.Visual C++ projelerinin çoğu için yeterli olan bir yerleşik ipucu dosyası içerir, ancak Visual Studio tanımlayıcıları işleme biçimini geliştirmek için kendi ipucu dosyaları oluşturabilirsiniz.

Senaryo

Aşağıdaki kod ile incelemek bir kaynak dosyası olduğunu varsayalım Sınıf Görünümü Tarayıcı., STDMETHOD Makro adında bir yöntemi bildirir. myMethod bir parametre alır ve bir işaretçi döndürür bir HRESULT.

/ / Kaynak kod dosyası. STDMETHOD(myMethod) (int parametre1);

Aşağıdaki makro tanımları ayrı bir üstbilgi dosyasında var.

/ / Üstbilgi dosyası. #define STDMETHOD(method) HRESULT (STDMETHODCALLTYPE * yöntemi) #define STDMETHODCALLTYPE #define __stdcall HRESULT void *

STDMETHOD adında bir işlev göründüğü bildirilmesi için ayrıştırma sistemi kaynak kodunu yorumlayamayabilir ve iki parametre listeleri olduğundan bildirim sözdizimi kurallarına göre yanlış.Ayrıştırma sistemi tanımlarını keşfetmek için üstbilgi dosyası açılmıyor STDMETHOD, STDMETHODCALLTYPE, ve HRESULT makrolar.Ayrıştırma sistemi yorumlayamadığından STDMETHOD Makro, Tam deyim yoksayar ve sonra ayrıştırma devam eder.

Projeniz üzerinde bir veya daha fazla önemli başlık dosyaları bağlı olabilir çünkü başlık dosyalarını ayrıştırma sistemi kullanmaz.Tüm üstbilgi dosyası değişirse, ayrıştırma sistemi IDE performansı düşürmesinin yanı, projenizdeki tüm üstbilgi dosyaları yeniden gözden geçirin gerekebilir.Bunun yerine, ayrıştırma sistemi nasıl işleneceğini belirtin ipuçlarını kullanır STDMETHOD, STDMETHODCALLTYPE, ve HRESULT makrolar.

Nasıl bir ipucu gerektiğini biliyor musunuz?Ve bir ipucu gereksiniminiz varsa, ne tür oluşturmanız gerekir?Bir ipucu gerekli bir işaretidir, bir tanımlayıcı görünümü Sınıf Görünümü Görünüm içinde tutarsız Düzenleyici.Örneğin, Sınıf Görünümü kaybolabileceğini bildiğiniz bir sınıf üyesi var görüntü veya üyenin adı doğru değil.Ne makroları gerektiren bir ipucu ortak problemleri çözmeye ipuçlarının türleri hakkında daha fazla bilgi için bkz:? bu konunun ilerleyen bölümlerinde.

Mimarisi

Fiziksel dizinler için ipucu dosyaları ilgilidir, mantıksal dizinleri de adı geçen Çözüm Gezgini.İpucu dosya etkili olabilmesi ipucu dosyası projenize eklemek zorunda değilsiniz.Yalnızca kaynak dosyalarını ayrıştırırken ipucu dosyalarını ayrıştırma sistemi kullanır.

Her ipucu dosyası cpp.Hint.Bu nedenle, birden çok dizinde bir ipucu dosyası içerebilir ancak yalnızca bir ipucu dosyası içinde belirli bir dizin ortaya çıkabilir.

Projenizi sıfır veya daha fazla ipucu dosyaları tarafından etkilenebilir.İpucu dosya yoksa ayrıştırma sistemi şifresi çözülemeyen kaynak kodunu yoksaymak için hata kurtarma tekniklerini kullanır.Aksi halde, ayrıştırma sistemi bulmak ve ipuçlarını toplamak için aşağıdaki strateji kullanır.

Dd997977.collapse_all(tr-tr,VS.110).gifArama sırası

Ayrıştırma sistemi dizinleri ipucu dosyaları için aşağıdaki sırayla arar.

  • Visual C++ (yükleme paketini içeren dizinvcpackages).Bu dizin gibi sık kullanılan sistem dosyaları, sembolleri tanımlayan bir yerleşik ipucu dosyası içerir. Windows.h.Sonuç olarak, projenize gerekli ipuçlarının çoğunu otomatik olarak devralır.

  • Kaynak dosyayı içeren dizini kök dizininde bir kaynak dosyanın yolu.Tipik bir Visual C++ projesinin kök dizini çözüm ya da proje dosyasýný içerir.

    Bu kuralın istisnası, bir Dosya Durdur Kaynak dosya yolu kullanılıyor.Bir Dur dosyası arama sırası üzerinde ek denetim sağlar ve adlı dosya cpp.Stop.Kök dizinden başlayarak yerine, kaynak dosyasının bulunduğu dizine Dur dosyayı içeren dizinden ayrıştırma sistemi arar.Tipik bir projede, Dur dosya gerekmez.

Dd997977.collapse_all(tr-tr,VS.110).gifİpucu toplanıyor

Sıfır veya daha fazla ipucu dosyası içerir. ipuçları.Bir ipucu tanımlı ya da sadece bir C/C++ makro gibi silinemez.Diğer bir deyişle, #define Önişlemci yönergesi oluşturur veya bir ipucu yeniden tanımlar ve #undef yönergesi bir ipucu siler.

Ayrıştırma sistemi daha önce açıklanan arama sırayla her ipucu dosyasını açtığında, her dosyanın ipuçlarını bir dizi birikir. etkili ipuçlarıve etkili ipuçları kodunuzda tanımlayıcılar yorumlamak için kullanır.

Ayrıştırma sistemi ipuçları biriktirmek için aşağıdaki kuralları kullanır.

  • Önceden tanımlı bir ad yeni ipucu belirtir, yeni ipucu etkili ipuçları için adı ekler.

  • Yeni ipucu zaten tanımlı bir adı belirtiyorsa, varolan ipucu yeni ipucu tanımını yeniden yapmaktadır.

  • Yeni ipucu ise bir #undef Varolan bir etkin ipucu belirtir yönergesi, varolan ipucu yeni ipucu siler.

Birinci kural etkili ipuçları daha önce açılmış ipucu dosyalarından devralınacağı anlamına gelir.Son iki kural anlamına gelir daha sonra arama sırayla ipuçları daha önce meydana gelen ipuçları geçersiz kılabilirsiniz.Örneğin, bir kaynak dosyasını içeren dizinde bir ipucu dosyası oluşturursanız, tüm önceki ipuçları geçersiz kılabilirsiniz.

İpuçları nasıl toplanır bir gösterimi için bkz. Örnek Bu konunun ilerleyen bölümlerinde bölümü.

Dd997977.collapse_all(tr-tr,VS.110).gifSözdizimi

İpuçları oluşturulur ve aynı söz dizimini, oluşturma ve silme makro önişlemci yönergeleri ile silinir.Aslında, ayrıştırma sistemi C/C++ önişlemci ipuçları değerlendirmek için kullanır.Önişlemci yönergeleri hakkında daha fazla bilgi için bkz. # define yönergesi (c/C++) ve #undef yönergesi (c/C++).

Yalnızca olağandışı sözdizimi öğeler @<, @=, ve @> değiştirme dizeleri.Bunlar ile birlikte yalnızca kullanılır ipucu dosyası belirli değiştirme dizeleri harita makrolar.Harita verileri, işlevler veya olaylar diğer verileri, işlevler veya olay işleyicileri ile ilgili makroları kümesidir.Örneğin, MFC eşlemeleri oluşturmak için kullanır ileti eşlemeleri, ve ATL eşlemeleri oluşturmak için kullanır Nesne eşleştirir.İpucu dosya belirli bir değiştirme dizeleri bir harita başlangıç, Orta ve bitiş öğelerini gösterir.Yalnızca bir harita makro adı önemlidir.Bu nedenle, her bir değiştirme dizesini kasıtlı olarak makro uygulaması gizler.

İpuçları aşağıdaki sözdizimini kullanın.

Sözdizimi

Anlamı

#defineİpucu adıdize değiştirme

#defineİpucu adı(parametre, ...)dize değiştirme

Yeni bir ipucu tanımlar veya varolan bir ipucu tanımını yeniden yapmaktadır preprocesser yönergesi.Önişlemci yönergesi sonra her geçtiği değiştirir İpucu adı kaynak kod ile dize değiştirme.

İkinci sözdizimi bir işlev gibi ipucu biçimini tanımlar.Bir işlev gibi ipucu kaynak kodunda ortaya çıkarsa, her geçtiği önişlemci ilk değiştirir parametre içinde dize değiştirme ile ilgili bağımsız kaynak kodu ve değiştirir İpucu adı ile dize değiştirme.

@<

İpucu dosya belirli bir dize değiştirme harita öğeleri kümesi başlangıcını gösterir.

@=

İpucu dosya belirli bir dize değiştirme bir ara harita öğesini gösterir.Harita birden çok harita öğesi olabilir.

@>

İpucu dosya belirli bir dize değiştirme harita öğeleri kümesi sonuna gösterir.

#undefİpucu adı

Önişlemci yönergesi varolan bir ipucu siler.İpucu adı tarafından sağlanan İpucu adı tanımlayıcı.

//Yorum

Tek satırlı yorum.

/*Yorum*/

Çok satırlı yorum.

Ne makroları gerektiren bir ipucu?

Belirli tür makro ayrıştırma sistemi ile etkileyebilir.Bu bölüm, tür bir sorun neden olabilir makro ve bu sorunu çözmek için oluşturabileceğiniz ipucu türünü açıklar.

Dd997977.collapse_all(tr-tr,VS.110).gifKesintiye uğratan makrolar

Bazı makrolar ayrıştırma kaynak kodu hatalı yorumlayan sisteme neden ancak gözatma deneyiminizi azaltmıyorsa göz ardı edilebilir.Kaynak kod açıklama dilini (örneğin)SAL) makroları yardımcı C++ öznitelikleri Bul programlama hataları gidermek.SAL ek açıklamalar kod gezinirken yoksaymak istiyorsanız, ek açıklamayı gizler bir ipucu dosyası oluşturmak isteyebilirsiniz.

Aşağıdaki kaynak kodunda parametre türü FormatWindowClassName() işlevi PXSTR, ve parametre adı szBuffer.Ancak, ayrıştırma sistem hataları _Pre_notnull_ ve _Post_z_ SAL ek açıklamaları için parametre türü veya parametre adı.

Kaynak kodu:

static void FormatWindowClassName(_Pre_notnull_ _Post_z_ PXSTR szBuffer)

Strateji: Null tanımı

Bu durumda bunlar yoktu sanki SAL ek açıklamaları değerlendirmek için stratejisidir.Bunu yapmak için bir ipucu, değiştirme dizesi null belirtin.Sonuç olarak, ek açıklamaları, ayrıştırma sistem göz ardı eder ve Sınıf Görünümü Tarayıcı bunları görüntülemez.(Visual C++ SAL ek açıklama gizleyen bir yerleşik ipucu dosyası içerir.)

İpucu dosyası:

#define _Pre_notnull_

Dd997977.collapse_all(tr-tr,VS.110).gifConcealed C/C++ dil öğelerinde

Bir makro bir C/C++ gizler, ayrıştırma sistemi kaynak kodu yanlış yorumluyor tipik bir neden olmasıdır Noktalama işaretçisi veya anahtar sözcük belirteci.Diğer bir deyişle, bir makro bir çift noktalayıcıları, yarısı gibi içerebilir <>, [], {}, ve ().

Aşağıdaki kaynak kodu START_NAMESPACE Makro gizler bir unpaired sol ayraç){).

Kaynak kodu:

#define START_NAMESPACE ad alanı MyProject {

Strateji: Doğrudan kopyalama

Bir makro semantiği gözatma deneyimi için kritik olan, makro için benzer bir ipucu oluşturun.Ayrıştırma sistemi Makro tanımında bir ipucu dosyası çözümler.

Makro kaynak dosyadaki diğer makrolar içeriyorsa, yalnızca zaten etkili ipuçları kümesi içinde olmaları durumunda bu makroları yorumlanmasını unutmayın.

İpucu dosyası:

#define START_NAMESPACE ad alanı MyProject {

Dd997977.collapse_all(tr-tr,VS.110).gifHaritalar

Bir harita bir başlangıç öğesi, bitiş öğesi ve sıfır veya daha fazla ara öğeleri atamak makrolar oluşur.Çünkü her harita makro C/C++ Dil öğelerini gizler ve tam bir C/C++ ifadesinin sözdizimi çok sayıda ayrı makro dağıtılmış haritalar ayrıştırma sistemi yanlış yorumluyor.

Aşağıdaki kaynak kodunu tanımlar. BEGIN_CATEGORY_MAP, IMPLEMENTED_CATEGORY, ve END_CATEGORY_MAP makrolar.

Kaynak kodu:

#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}}; \ (pMap) döndürür; }

Strateji: Harita öğeleri tanımlamak

Başlangıç, Orta (varsa) ve son ipuçlarını belirtmek eşleme öğeleri.Özel harita değiştirme dizeleri kullanmak, @<, @=, ve @>.Daha fazla bilgi için bkz: Sözdizimi Bu konu bölümünde.

İpucu dosyası:

/ / Start haritası. #define BEGIN_CATEGORY_MAP(x) @<
/ / Orta harita öğesi. #define IMPLEMENTED_CATEGORY(catID) @=
/ / Orta harita öğesi. #define REQUIRED_CATEGORY(catID) @=
/ / End haritası. #define END_CATEGORY_MAP() @>

Dd997977.collapse_all(tr-tr,VS.110).gifBileşik makrolar

Bileşik makrolar, bir veya daha fazla ayrıştırma sistemi kafasını makro türlerini içerir.

Aşağıdaki kaynak kodunu içerir. START_NAMESPACE bir ad kapsamı başlangıcını belirtir, makro ve BEGIN_CATEGORY_MAP Makro bir harita başlangıcını belirtir.

Kaynak kodu:

#define NSandMAP START_NAMESPACE BEGIN_CATEGORY_MAP

Strateji: Doğrudan kopyalama

Oluşturmak için ipuçları START_NAMESPACE ve BEGIN_CATEGORY_MAP Makrolar ve daha sonra oluşturmak için bir ipucu NSandMAP Makro kaynak kodu daha önce gösterildiği gibi aynıdır.Alternatif olarak, bir bileşik makro yalnızca kesintiye uğratan makrolar ve beyaz boşluk içeriyorsa, bir ipucu, değiştirme dizesi null tanımıdır tanımlayabilirsiniz.

Bu örnekte, varsayalım START_NAMESPACE zaten bu konuda açıklandığı gibi bir ipucu var Concealed C/C++ dil öğelerinde alt başlık.Ve varsayalım BEGIN_CATEGORY_MAP daha önce açıklandığı gibi bir ipucu var Haritalar.

İpucu dosyası:

#define NSandMAP START_NAMESPACE BEGIN_CATEGORY_MAP

Dd997977.collapse_all(tr-tr,VS.110).gifYaratan makrolar

Bazı makrolar ayrıştırma sistemi tarafından yorumlanabilir, ancak kaynak kodunu makro uzun veya karmaşık olduğu için okumakta.Okunabilirlik için makro görüntüsünü basitleştiren bir ipucu sağlar.

Kaynak kodu:

#define STDMETHOD(methodName) HRESULT (STDMETHODCALLTYPE * methodName)

Strateji: Basitleştirme

Bir ipucu daha basit bir makro tanımı görüntüler oluşturun.

İpucu dosyası:

#define STDMETHOD(methodName) void * methodName

Örnek

Aşağıdaki örnek, nasıl ipuçları ipucu dosyalarından biriktirilir gösterir.Bu örnekte, Dur dosyaları kullanılmıyor.

Bir Visual C++ projesinin fiziksel dizinler bazıları aşağıda gösterilmektedir.İpucu dosyalar içinde vcpackages, Hata ayıklama, A1, ve A2 dizinler.

Dd997977.collapse_all(tr-tr,VS.110).gifİpucu dosyası dizinleri

Ortak veya projeye özgü ipucu dosyası dizinleri.

Dd997977.collapse_all(tr-tr,VS.110).gifDizin ve dosya içeriğini İpucu

Aşağıdaki tabloda bu projede ipucu dosyaları ve bu ipucu dosyaların içeriğini içeren dizinleri listeler.Birçok ipuçlarını bazıları vcpackages Dizin ipucu dosyası listelenir.

Dizin

İpucu dosyası içeriği

vcpackages

/ / vcpackages (kısmi liste) #define _In_ #define _In_opt_ #define _In_z_ #define _In_opt_z_ #define _In_count_(size)

Hata ayıklama

/ / Debug #undef _In_ #define OBRACE {#define CBRACE} #define RAISE_EXCEPTION(x) throw (x) #define START_NAMESPACE ad MyProject {#define END_NAMESPACE}

A1

/ / A1 #define START_NAMESPACE ad A1Namespace {

A2

/ / A2 #undef OBRACE #undef CBRACE

Dd997977.collapse_all(tr-tr,VS.110).gifEtkili ipuçları

Aşağıdaki tabloda bu projedeki kaynak dosyalar için etkili ipuçları listelenmektedir.

Kaynak dosyası

Etkili ipuçları

A1_A2_B.cpp

/ / vcpackages (kısmi liste) #define _In_opt_ #define _In_z_ #define _In_opt_z_ #define _In_count_(size) / / Debug... #define RAISE_EXCEPTION(x) throw (x) / / A1 #define START_NAMESPACE ad A1Namespace {/ /...#Define END_NAMESPACE hata ayıklama}

Önceki tablonun aşağıdaki notları uygulanır.

  • Etkili ipuçları arasındadır vcpackages, Hata ayıklama, A1, ve A2 dizinler.

  • , #undef yönergesini Hata ayıklama İpucu dosya kaldırıldı #define _In_ içinde İpucu vcpackages Dizin ipucu dosyası.

  • İpucu dosyasında A1 dizini yeniden tanımlar START_NAMESPACE.

  • , #undef içinde İpucu A2 Dizin ipuçları kaldırıldı OBRACE ve CBRACE içinde Hata ayıklama Dizin ipucu dosyası.

Ayrıca bkz.

Başvuru

# define yönergesi (c/C++)

#undef yönergesi (c/C++)

İleti eşlemeleri (mfc)

Kavramlar

Visual C++ projeler için oluşturulan dosya türleri

sal açıklamaları

Diğer Kaynaklar

Oluşturma ve ortam Windows denetleme

İleti eşleme makrolar (atl)

Nesne eşleme makrolar