Aracılığıyla paylaş


İpucu Dosyaları

İpucu dosyası , aksi takdirde C++ Gözatma Veritabanı Ayrıştırıcısı tarafından kod bölgelerinin atlanmasına neden olabilecek makrolar içerir. Visual Studio C++ projesini açtığınızda ayrıştırıcı, projedeki her kaynak dosyadaki kodu analiz eder ve her tanımlayıcı hakkında bilgi içeren bir veritabanı oluşturur. IDE bu bilgileri Sınıf Görünümü tarayıcısı ve Gezinti Çubuğu gibi kod gözatma özelliklerini desteklemek için kullanır.

C++ Gözatma Veritabanı Ayrıştırıcısı, kısa bir süre içinde büyük miktarda kodu ayrıştırabilen benzer bir ayrıştırıcıdır. Hızlı olmasının bir nedeni, blokların içeriğini atlıyor olmasıdır. Örneğin, yalnızca bir işlevin konumunu ve parametrelerini kaydeder ve içeriğini yoksayar. Bazı makrolar, bir bloğun başlangıcını ve sonunu belirlemek için kullanılan buluşsal yöntemler için sorunlara neden olabilir. Bu sorunlar, kod bölgelerinin yanlış kaydedilmesine neden olur.

Atlanan bu bölgeler birden çok şekilde bildirimde bulunabilir:

  • Sınıf Görünümü, Git ve Gezinti Çubuğu'nda eksik türler ve işlevler

  • Gezinti Çubuğu'nda yanlış kapsamlar

  • Önceden tanımlanmış işlevler için Bildirim/Tanım Oluşturma Önerileri

İpucu dosyası, C/C++ makro tanımlarıyla aynı söz dizimine sahip, kullanıcı tarafından özelleştirilebilir ipuçları içerir. Visual C++ çoğu proje için yeterli olan yerleşik bir ipucu dosyası içerir. Ancak ayrıştırıcıyı projenize özel olarak geliştirmek için kendi ipucu dosyalarınızı oluşturabilirsiniz.

Önemli

İpucu dosyasını değiştirir veya eklerseniz değişikliklerin etkili olması için ek adımlar uygulamanız gerekir:

  • Visual Studio 2017 sürüm 15.6'nın önceki sürümlerinde: Tüm değişiklikler için çözümdeki .sdf dosyasını ve/veya VC.db dosyasını silin.
  • Visual Studio 2017 sürüm 15.6 ve sonraki sürümlerde: Yeni ipucu dosyaları ekledikten sonra çözümü kapatıp yeniden açın.

Senaryo

#define NOEXCEPT noexcept
void Function() NOEXCEPT
{
}

İpucu dosyası olmadan, Function Sınıf Görünümü, Git veya Gezinti Çubuğu'nda gösterilmez. Bu makro tanımına sahip bir ipucu dosyası ekledikten sonra, ayrıştırıcı artık makroyu NOEXCEPT anlar ve değiştirir ve işlevi doğru şekilde ayrıştırmasına olanak tanır:

#define NOEXCEPT

Kesintiye Neden Olan Makrolar

Ayrıştırıcıyı bozan iki makro kategorisi vardır:

  • İşlevi süsleyen anahtar sözcükleri kapsülleyen makrolar

    #define NOEXCEPT noexcept
    #define STDMETHODCALLTYPE __stdcall
    

    Bu tür makrolar için ipucu dosyasında yalnızca makro adı gereklidir:

    #define NOEXCEPT
    #define STDMETHODCALLTYPE
    
  • Dengesiz köşeli ayraçlar içeren makrolar

    #define BEGIN {
    

    Bu tür makrolar için, ipucu dosyasında hem makro adı hem de içeriği gereklidir:

    #define BEGIN {
    

Düzenleyici Desteği

Visual Studio 2017 sürüm 15.8'den başlayarak, kesintiye neden olan makroları tanımlamak için çeşitli özellikler vardır:

  • Ayrıştırıcı tarafından atlanan bölgelerin içindeki makrolar vurgulanır.

  • Makroyu ipucu dosyasına eklemek için vurgulanan makroyu içeren bir ipucu dosyası oluşturmak veya mevcut bir ipucu dosyası varsa hızlı bir işlem vardır.

Highlighted Macro.

Hızlı eylemlerden birini yürütürken ayrıştırıcı ipucu dosyasından etkilenen dosyaları yeniden ayrıştırıyor.

Varsayılan olarak, sorun makrosu öneri olarak vurgulanır. Vurgu, kırmızı veya yeşil dalgalı çizgi gibi daha belirgin bir değerle değiştirilebilir. Araçlar>Seçenekleri>Metin Düzenleyicisi>C/C++>Görünüm altındaki Kod Dalgalı Çizgiler bölümündeki Atlanan Gözatma Bölgelerindeki Makrolar seçeneğini kullanın.

Macros in Skipped Browsing Regions Option.

Gözatma Veritabanı Hatalarını Görüntüleme

Proje>Görüntüleme Gözatma Veritabanı Hataları menü komutu, Hata Listesi'nde ayrıştırılamadı tüm bölgeleri görüntüler. komutu, ilk ipucu dosyasının oluşturulmasını kolaylaştırmaya yöneliktir. Ancak ayrıştırıcı, hatanın nedeninin kesintiye neden olan bir makro olup olmadığını anlayamaz, bu nedenle her hatayı değerlendirmeniz gerekir. Gözatma Veritabanı Hatalarını Görüntüle komutunu çalıştırın ve etkilenen dosyayı düzenleyicide yüklemek için her hataya gidin. Dosya yüklendikten sonra, bölgede makro varsa bunlar vurgulanır. Hızlı Eylemler'i çağırarak bunları bir ipucu dosyasına ekleyebilirsiniz. İpucu dosyası güncelleştirmesinin ardından hata listesi otomatik olarak güncelleştirilir. Alternatif olarak, ipucu dosyasını el ile değiştiriyorsanız, bir güncelleştirmeyi tetikmek için Çözümü Yeniden Tara komutunu kullanabilirsiniz.

Mimari

İpucu dosyaları, Çözüm Gezgini gösterilen mantıksal dizinlerle değil fiziksel dizinlerle ilgilidir. İpucu dosyasının etkili olması için projenize ipucu dosyası eklemeniz gerekmez. Ayrıştırma sistemi, ipucu dosyalarını yalnızca kaynak dosyaları ayrıştırdığında kullanır.

Her ipucu dosyası cpp.hint olarak adlandırılır. Birçok dizin bir ipucu dosyası içerebilir, ancak belirli bir dizinde yalnızca bir ipucu dosyası oluşabilir.

Projeniz sıfır veya daha fazla ipucu dosyasından etkilenebilir. İpucu dosyası yoksa, ayrıştırma sistemi, şifrelenemez kaynak kodunu yoksaymak için hata kurtarma tekniklerini kullanır. Aksi takdirde, ayrıştırma sistemi ipuçlarını bulmak ve toplamak için aşağıdaki stratejiyi kullanır.

Arama Sırası

Ayrıştırma sistemi, dizinlerde ipucu dosyalarını aşağıdaki sırayla arar.

  • Visual C++ (vcpackages) için yükleme paketini içeren dizin. Bu dizin, windows.h gibi sık kullanılan sistem dosyalarındaki simgeleri açıklayan yerleşik bir ipucu dosyası içerir. Sonuç olarak, projeniz ihtiyaç duyduğu ipuçlarının çoğunu otomatik olarak devralır.

  • Kaynak dosyanın kök dizininden kaynak dosyanın kendisini içeren dizine giden yol. Tipik bir Visual Studio C++ projesinde kök dizin çözüm veya proje dosyasını içerir.

    Bu kuralın istisnası, bir durdurma dosyasının kaynak dosyanın yolunda olmasıdır. Durdurma dosyası, cpp.stop adlı herhangi bir dosyadır. Durdurma dosyası, arama sırası üzerinde ek denetim sağlar. Ayrıştırma sistemi kök dizinden başlamak yerine, durdurma dosyasını içeren dizinden kaynak dosyayı içeren dizine aramalar. Tipik bir projede durdurma dosyasına ihtiyacınız yoktur.

İpucu Toplama

İpucu dosyası sıfır veya daha fazla ipucu içerir. bir ipucu, C/C++ makroları gibi tanımlanır veya silinir. Yani, #define önişlemci yönergesi bir ipucu oluşturur veya yeniden tanımlar ve #undef yönergesi bir ipucu siler.

Ayrıştırma sistemi her ipucu dosyasını daha önce açıklanan arama sırasına göre açar. Her dosyanın ipuçlarını bir dizi etkili ipucu içinde birleştirir ve ardından geçerli ipuçlarını kullanarak kodunuzdaki tanımlayıcıları yorumlar.

Ayrıştırma sistemi ipuçları biriktirmek için şu kuralları kullanır:

  • Yeni ipucu henüz tanımlanmamış bir ad belirtiyorsa, yeni ipucu geçerli ipuçlarına adı ekler.

  • Yeni ipucu önceden tanımlanmış bir ad belirtiyorsa, yeni ipucu mevcut ipucunu yeniden tanımlar.

  • Yeni ipucu, mevcut etkili ipucunu belirten bir #undef yönergeyse, yeni ipucu mevcut ipucunu siler.

İlk kural, etkili ipuçlarının daha önce açılmış ipucu dosyalarından devralındığı anlamına gelir. Son iki kural, daha sonra arama sırasına gelen ipuçlarının önceki ipuçlarını geçersiz kılabilmesi anlamına gelir. Örneğin, kaynak dosya içeren dizinde bir ipucu dosyası oluşturursanız, önceki ipuçlarını geçersiz kılabilirsiniz.

İpuçlarının nasıl toplandığına ilişkin bir resim için Örnek bölümüne bakın.

Sözdizimi

Makroları oluşturmak ve silmek için önişlemci yönergeleriyle aynı söz dizimini kullanarak ipuçları oluşturup silersiniz. Aslında, ayrıştırma sistemi ipuçlarını değerlendirmek için C/C++ ön işlemcisini 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++).

Tek olağan dışı söz dizimi öğeleri , @=ve @> değiştirme dizeleridir@<. Bu ipucu dosyasına özgü değiştirme dizeleri yalnızca eşleme makrolarında kullanılır. Eşleme, verileri, işlevleri veya olayları diğer verilerle, işlevlerle veya olay işleyicileriyle ilişkilendiren bir makro kümesidir. Örneğin, MFC ileti eşlemeleri oluşturmak için eşlemeleri ve ATL nesne eşlemeleri oluşturmak için eşlemeleri kullanır. İpucu dosyasına özgü değiştirme dizeleri bir eşlemenin başlangıç, ara ve bitiş öğelerini işaretler. Yalnızca harita makrosunun adı önemlidir. Bu nedenle, her değiştirme dizesi kasıtlı olarak makronun uygulamasını gizler.

İpuçları şu söz dizimlerini kullanır:

Sözdizimi Anlamı
#defineipucu-adıdeğiştirme-dizesi

#defineipucu-adı(parametresi, ...)değiştirme dizesi
Yeni ipucu tanımlayan veya mevcut ipucunu yeniden tanımlayan bir önişlemci yönergesi. Yönergeden sonra, önişlemci kaynak koddaki her ipucu-adı oluşumunu replace-string ile değiştirir.

İkinci söz dizimi formu işlev benzeri bir ipucu tanımlar. Kaynak kodda işlev benzeri bir ipucu oluşursa, önişlemci önce değiştirme dizesindeki parametrenin her oluşumunu kaynak kodundaki karşılık gelen bağımsız değişkenle değiştirir ve ardından ipucu-adını değiştirme dizesiyle değiştirir.
@< Harita öğeleri kümesinin başlangıcını gösteren bir ipucu dosyasına özgü değiştirme dizesi .
@= Ara eşleme öğesini gösteren bir ipucu dosyasına özgü değiştirme dizesi . Bir haritanın birden çok eşleme öğesi olabilir.
@> Bir harita öğeleri kümesinin sonunu gösteren bir ipucu dosyasına özgü değiştirme dizesi .
#undefipucu-adı Var olan bir ipucunu silecek önişlemci yönergesi. İpucunun adı, ipucu-adı tanımlayıcısı tarafından sağlanır.
//Yorum Tek satırlık bir açıklama.
/*Yorum*/ Çok satırlı bir açıklama.

Örnek

Bu örnekte ipuçlarının ipucu dosyalarından nasıl biriktiği gösterilmektedir. Durdurma dosyaları bu örnekte kullanılmaz.

Çizimde Visual Studio C++ projesindeki bazı fiziksel dizinler gösterilmektedir. , , DebugA1ve A2 dizinlerinde vcpackagesipucu dosyaları vardır.

İpucu Dosya Dizinleri

Diagram showing the common and project specific hint file directories.

Dizinler ve İpucu Dosyası İçeriği

Bu liste, bu projedeki ipucu dosyalarını içeren dizinleri ve bu ipucu dosyalarının içeriğini gösterir. Dizin ipucu dosyasındaki birçok ipucundan vcpackages yalnızca bazıları listelenir:

  • vcpackages

    // vcpackages (partial list)
    #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 namespace MyProject {
    #define END_NAMESPACE }
    
  • A1

    // A1
    #define START_NAMESPACE namespace A1Namespace {
    
  • A2

    // A2
    #undef OBRACE
    #undef CBRACE
    

Etkili İpuçları

Bu tabloda, bu projedeki kaynak dosyalar için etkili ipuçları listelenir:

  • Kaynak Dosya: A1_A2_B.cpp

  • Etkili ipuçları:

    // vcpackages (partial list)
    #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 namespace A1Namespace {
    // ...Debug
    #define END_NAMESPACE }
    

Bu notlar önceki listeye uygulanır:

  • Etkili ipuçları , , DebugA1ve A2 dizinlerindendirvcpackages.

  • İpucu dosyasındaki Debug #undef yönergesi, dizin ipucu dosyasındaki ipucunu vcpackages kaldırdı#define _In_.

  • dizinindeki A1 ipucu dosyası öğesini yeniden tanımlar START_NAMESPACE.

  • #undef Dizindeki A2 ipucu, ve dizin ipucu dosyasındaki Debug ipuçlarını OBRACECBRACE kaldırdı.

Ayrıca bkz.

Visual Studio C++ projeleri için Oluşturulan Dosya Türleri
#define Yönergesi (C/C++)
#undef Yönergesi (C/C++)
SAL Ek Açıklamaları