İzlenecek yol: Microsoft Visual C++'da üst bilgi birimleri oluşturma ve içeri aktarma

Bu makale, Visual Studio 2022 ile üst bilgi birimleri oluşturma ve içeri aktarma hakkındadır. C++ standart kitaplık üst bilgilerini üst bilgi birimi olarak içeri aktarmayı öğrenmek için bkz . İzlenecek yol: STL kitaplıklarını üst bilgi birimi olarak içeri aktarma. Standart kitaplığı içeri aktarmanın daha hızlı ve daha sağlam bir yolu için bkz . Öğretici: Modülleri kullanarak C++ standart kitaplığını içeri aktarma.

Üst bilgi birimleri, önceden derlenmiş üst bilgi dosyalarına (PCH) önerilen alternatiftir. Üst bilgi birimlerinin ayarlanması ve kullanılması daha kolaydır, diskte önemli ölçüde daha küçüktür, benzer performans avantajları sağlar ve paylaşılan PCH'den daha esnektir.

Üst bilgi birimlerini programlarınıza işlevsellik eklemenin diğer yollarıyla karşılaştırmak için bkz . Üst bilgi birimlerini, modülleri ve önceden derlenmiş üst bilgileri karşılaştırma.

Önkoşullar

Üst bilgi birimlerini kullanmak için Visual Studio 2019 16.10 veya üzeri gerekir.

Üst bilgi birimi nedir?

Üst bilgi birimi, üst bilgi dosyasının ikili gösterimidir. Üst bilgi birimi bir .ifc uzantıyla biter. Adlandırılmış modüller için aynı biçim kullanılır.

Üst bilgi birimiyle üst bilgi dosyası arasındaki önemli bir fark, üst bilgi biriminin üst bilgi biriminin dışındaki makro tanımlarından etkilenmemesidir. Başka bir ifadeyle, üst bilgi biriminin farklı davranmasına neden olan bir ön işlemci simgesi tanımlayamazsınız. Üst bilgi birimini içeri aktardığınızda, üst bilgi birimi zaten derlenmiş olur. Bu, bir #include dosyanın nasıl ele alındığını gösterir. Eklenen bir dosya, üst bilgi dosyasını içeren kaynak dosyayı derlerken ön işlemciden geçtiğinden, üst bilgi dosyasının dışındaki bir makro tanımından etkilenebilir.

Üst bilgi birimleri herhangi bir sırada içeri aktarılabilir; bu, üst bilgi dosyaları için geçerli değildir. Üst bilgi dosyası sırası önemlidir çünkü bir üst bilgi dosyasında tanımlanan makro tanımları sonraki bir üst bilgi dosyasını etkileyebilir. Bir üst bilgi birimindeki makro tanımları başka bir üst bilgi birimini etkilemez.

Üst bilgi dosyasından görünen her şey, üst bilgi birimi içinde tanımlanan makrolar da dahil olmak üzere bir üst bilgi biriminden de görülebilir.

Bir üst bilgi dosyasının içeri aktarılabilmesi için önce üst bilgi birimine çevrilmesi gerekir. Üst bilgi birimlerinin önceden derlenmiş üst bilgi dosyalarına (PCH) göre avantajlarından biri, dağıtılmış derlemelerde kullanılabilmeleridir. ve dosyasını aynı derleyiciyle içeri aktaran programı derleyip .ifc aynı platformu ve mimariyi hedeflediğiniz sürece, bir bilgisayarda üretilen üst bilgi birimi başka bir bilgisayarda kullanılabilir. PCH'nin aksine, bir üst bilgi birimi değiştiğinde, yalnızca bu birim ve buna bağlı olan şey yeniden oluşturulur. Üst bilgi birimleri, boyutundan daha .pchküçük bir boyut sırasına kadar olabilir.

Üst bilgi birimleri, üst bilgi birimini oluşturmak ve bunu kullanan kodu derlemek için kullanılan derleyici anahtarı bileşimlerinin gerekli benzerliklerine bir PCH'den daha az kısıtlama uygular. Ancak, bazı anahtar bileşimleri ve makro tanımları, çeşitli çeviri birimleri arasında tek tanım kuralı (ODR) ihlalleri oluşturabilir.

Son olarak, üst bilgi birimleri PCH'den daha esnek olur. PCH ile, PCH'deki üst bilgilerden yalnızca birini getirmeyi seçemezsiniz; derleyici bunların tümünü işler. Üst bilgi birimleriyle, bunları statik bir kitaplıkta derleseniz bile, yalnızca uygulamanıza içeri aktardığınız üst bilgi biriminin içeriğini getirirsiniz.

Üst bilgi birimleri, üst bilgi dosyalarıyla C++20 modülleri arasındaki bir adımdır. Bu modüller modüllerin avantajlarından bazılarını sağlar. Dış makro tanımları bunları etkilemediğinden daha sağlamdır; bu nedenle bunları herhangi bir sırayla içeri aktarabilirsiniz. Ayrıca derleyici bunları üst bilgi dosyalarından daha hızlı işleyebilir. Ancak üst bilgi birimleri içinde tanımlanan makroları kullanıma sağladığından (modüller yoktur) üst bilgi birimleri modüllerin tüm avantajlarına sahip değildir. Modüllerden farklı olarak, üst bilgi biriminde özel uygulamayı gizlemenin bir yolu yoktur. Üst bilgi dosyalarıyla özel uygulamayı göstermek için, adlara önde gelen alt çizgi ekleme veya bir uygulama ad alanına ekleme gibi farklı teknikler kullanılır. Modül özel uygulamayı herhangi bir biçimde kullanıma sunmaz, bu nedenle bunu yapmanız gerekmez.

Önceden derlenmiş üst bilgilerinizi üst bilgi birimleriyle değiştirmeyi göz önünde bulundurun. Aynı hız avantajını elde edersiniz, ancak diğer kod hijyeni ve esneklik avantajlarıyla da.

Üst bilgi birimi derlemenin yolları

Bir dosyayı üst bilgi birimine derlemenin birkaç yolu vardır:

  • Paylaşılan üst bilgi birimi projesi oluşturun. Kuruluş üzerinde daha fazla denetim sağladığından ve içeri aktarılan üst bilgi birimlerinin yeniden kullanılmasından dolayı bu yaklaşımı öneririz. İstediğiniz üst bilgi birimlerini içeren bir statik kitaplık projesi oluşturun ve üst bilgi birimlerini içeri aktarmak için bu projeye başvurun. Bu yaklaşımın izlenecek yolu için bkz . Üst bilgi birimleri için üst bilgi birimi statik kitaplık projesi oluşturma.

  • Üst bilgi birimlerine çevrilecek dosyaları tek tek seçin. Bu yaklaşım, üst bilgi birimi olarak ele alınanlar üzerinde dosyaya göre denetim sağlar. Ayrıca, varsayılan uzantısı (.ixx, .cppm, , .h.hpp) olmadığından normalde bir üst bilgi biriminde derlenmeyecek bir üst bilgi birimi olarak bir dosyayı derlemeniz gerektiğinde de yararlıdır. Bu yaklaşım bu kılavuzda gösterilmiştir. Başlamak için bkz . Yaklaşım 1: Belirli bir dosyayı üst bilgi birimine çevirme.

  • Üst bilgi birimlerini otomatik olarak tarayın ve derleyin. Bu yaklaşım kullanışlıdır, ancak en iyi derleme aktarım hızını garanti etmediğinden daha küçük projeler için en uygun yöntemdir. Bu yaklaşımla ilgili ayrıntılar için bkz . Yaklaşım 2: Üst bilgi birimlerini otomatik olarak tara.

  • Giriş bölümünde belirtildiği gibi, STL üst bilgi dosyalarını üst bilgi birimi olarak derleyip içeri aktarabilir ve kodunuzu yeniden yazmadan STL kitaplık üst bilgilerine otomatik #include olarak davranabilirsiniz import . Nasıl yapıldığını görmek için İzlenecek Yol: STL kitaplıklarını üst bilgi birimi olarak içeri aktarma makalesini ziyaret edin.

Yaklaşım 1: Belirli bir dosyayı üst bilgi birimine çevirme

Bu bölümde, üst bilgi birimine çevrilecek belirli bir dosyanın nasıl seçileceği gösterilir. Visual Studio'da aşağıdaki adımları kullanarak üst bilgi dosyasını üst bilgi birimi olarak derleyin:

  1. Yeni bir C++ konsol uygulaması projesi oluşturun.

  2. Kaynak dosya içeriğini aşağıdaki gibi değiştirin:

    #include "Pythagorean.h"
    
    int main()
    {
        PrintPythagoreanTriple(2,3);
        return 0;
    }
    
  3. adlı Pythagorean.h bir üst bilgi dosyası ekleyin ve içeriğini şu kodla değiştirin:

    #ifndef PYTHAGOREAN
    #define PYTHAGOREAN
    
    #include <iostream>
    
    inline void PrintPythagoreanTriple(int a, int b)
    {
        std::cout << "Pythagorean triple a:" << a << " b:" << b << " c:" << a*a + b*b << std::endl;
    }
    #endif
    

Proje özelliklerini ayarlama

Üst bilgi birimlerini etkinleştirmek için, aşağıdaki adımlarla önce C++ Dil Standardı'nı veya sonraki bir sürümüne /std:c++20 ayarlayın:

  1. Çözüm Gezgini'da proje adına sağ tıklayın ve Özellikler'i seçin.
  2. Proje özellik sayfaları penceresinin sol bölmesinde Yapılandırma Özellikleri Genel'i> seçin.
  3. C++ Dil Standardı açılan listesinde ISO C++20 Standart (/std:c++20) veya üzerini seçin. İletişim kutusunu kapatmak için Tamam'ı seçin.

Üst bilgi dosyasını üst bilgi birimi olarak derleyin:

  1. Çözüm Gezgini'da, üst bilgi birimi olarak derlemek istediğiniz dosyayı seçin (bu örnekte). Pythagorean.h Dosyaya sağ tıklayın ve Özellikler'i seçin.

  2. Yapılandırma özellikleri>Genel>Öğe Türü açılan listesini C/C++ derleyicisi olarak ayarlayın ve Tamam'ı seçin.

    Öğe türünü C/C++ derleyicisi olarak değiştirmeyi gösteren ekran görüntüsü.

Bu kılavuzun ilerleyen bölümlerinde bu projeyi derlediğinizde, Pythagorean.h bir üst bilgi birimine çevrilir. Bu üst bilgi dosyasının öğe türü C/C++ derleyicisi olarak ayarlandığından ve ve .hpp dosyaları için .h varsayılan eylem bu şekilde ayarlandığından dosyayı üst bilgi birimine çevirmek olduğundan, bu bir üst bilgi birimine çevrilir.

Not

Bu kılavuz için bu gerekli değildir, ancak bilgileriniz için sağlanır. Örneğin, bir dosyayı varsayılan üst bilgi birimi dosya uzantısı olmayan bir üst bilgi birimi olarak derlemek için C.cpp/C++>Gelişmiş>Derleme Olarak Yapılandırma özelliklerini>C++ Üst Bilgi Birimi (/exportHeader) olarak Derle olarak ayarlayın:C++ > Üst Bilgi Birimi (/exportHeader) olarak Derlemek için C/C++ Gelişmiş > Farklı Derleme Yapılandırma özelliklerini > değiştirmeyi gösteren ekran görüntüsü.

Üst bilgi birimini içeri aktarmak için kodunuzu değiştirme

  1. Örnek projenin kaynak dosyasında, Sondaki noktalı virgülleri unutma olarak değiştirin #include "Pythagorean.h" import "Pythagorean.h"; . Deyimler için import gereklidir. Bu, projenin yerel dizinindeki bir üst bilgi dosyası olduğundan, deyimiyle import tırnak işaretleri kullandık: import "file";. Kendi projelerinizde, bir sistem üst bilgisinden üst bilgi birimi derlemek için açılı ayraçları kullanın: import <file>;

  2. Ana menüden Derleme Çözümü'ne>tıklayarak çözümü derleyin. Beklenen çıkışı ürettiğini görmek için çalıştırın: Pythagorean triple a:2 b:3 c:13

Kendi projelerinizde, üst bilgi birimi olarak içeri aktarmak istediğiniz üst bilgi dosyalarını derlemek için bu işlemi yineleyin.

Yalnızca birkaç üst bilgi dosyasını üst bilgi birimlerine dönüştürmek istiyorsanız, bu yaklaşım iyidir. Ancak derlemek istediğiniz çok sayıda üst bilgi dosyanız varsa ve derleme performansının olası kaybı, derleme sisteminin bunları otomatik olarak işlemesini sağlama kolaylığından daha ağır basarsa aşağıdaki bölüme bakın.

STL kitaplık üst bilgilerini özellikle üst bilgi birimi olarak içeri aktarmak istiyorsanız bkz . İzlenecek yol: STL kitaplıklarını üst bilgi birimi olarak içeri aktarma.

Yaklaşım 2: Üst bilgi birimlerini otomatik olarak tara ve derle

Tüm kaynak dosyalarınızı üst bilgi birimleri için taramak ve bunları oluşturmak zaman aldığından, aşağıdaki yaklaşım daha küçük projeler için en uygun yöntemdir. En iyi derleme aktarım hızını garanti etmez.

Bu yaklaşım iki Visual Studio proje ayarlarını birleştirir:

  • Modül Bağımlılıkları için Kaynakları Tarama, derleme sisteminin derleyiciyi çağırarak, bunlara bağımlı dosyaları derlemeden önce tüm içeri aktarılan modüllerin ve üst bilgi birimlerinin derlenmesini sağlar. İçeri Aktarmaya İçeriği Çevir ile birleştirildiğinde, üst bilgi dosyasıyla aynı dizinde bulunan bir header-units.json dosyada da belirtilen kaynağınızda bulunan tüm üst bilgi dosyaları üst bilgi birimlerinde derlenir.
  • İçeri Aktarmaya Çevir, üst bilgi dosyasını üst import bilgi birimi olarak derlenebilen bir üst bilgi dosyasına başvuruyorsa #include (bir dosyada header-units.json belirtildiği gibi) ve üst bilgi dosyası için derlenmiş bir üst bilgi birimi kullanılabiliyorsa bir üst bilgi dosyası olarak ele alır. Aksi takdirde, üst bilgi dosyası normal #includeolarak değerlendirilir. Dosya header-units.json , sembol yinelemesi olmadan her #includebiri için üst bilgi birimlerini otomatik olarak oluşturmak için kullanılır.

Bu ayarları projenizin özelliklerinde açabilirsiniz. Bunu yapmak için, Çözüm Gezgini projeye sağ tıklayın ve Özellikler'i seçin. Ardından Yapılandırma Özellikleri>C/C++>Genel'i seçin.

Yapılandırma vurgulanmış ve Tüm Yapılandırmalar'ın seçili olduğu proje özellikleri ekranını gösteren ekran görüntüsü. C/C++ > Genel altında, Modül Bağımlılıkları için Kaynakları Tara vurgulanır ve evet olarak ayarlanır, İçeri Aktarmalara İçeri Aktarmaya Çevir vurgulanır ve Evet (/translateInclude) olarak ayarlanır

Modül Bağımlılıkları için Tarama Kaynakları burada gösterildiği gibi Proje Özellikleri'ndeki projedeki tüm dosyalar için veya Dosya Özellikleri'ndeki tek tek dosyalar için ayarlanabilir. Modüller ve üst bilgi birimleri her zaman taranır. Otomatik olarak derlenmesini istediğiniz ve henüz derlenmemiş olabilecek üst bilgi birimlerini içeri aktaran bir .cpp dosyanız olduğunda bu seçeneği ayarlayın.

Bu ayarlar, bu koşullar altında üst bilgi birimlerini otomatik olarak oluşturmak ve içeri aktarmak için birlikte çalışır:

  • Modül Bağımlılıkları için Kaynakları Tara, kaynaklarınızda üst bilgi birimi olarak ele alınabilecek dosyaları ve bağımlılıklarını tarar. uzantısına .ixxsahip dosyalar ve Dosya özellikleri>C/C++>Farklı Derle özelliği C++ Üst Bilgi Birimi (/dışarı aktarma) olarak derle olarak ayarlanmış dosyalar, bu ayardan bağımsız olarak her zaman taranır. Derleyici ayrıca üst bilgi birimi bağımlılıklarını tanımlamak için import deyimleri arar. belirtilirse /translateInclude , derleyici ayrıca üst bilgi birimi olarak ele almak üzere #include bir header-units.json dosyada da belirtilen yönergeleri tarar. Bağımlılık grafiği, projenizdeki tüm modüllerden ve üst bilgi birimlerinden oluşturulur.
  • İçeri Aktarmalara İçeri Aktarmaya Çevir Derleyici bir #include deyimle karşılaştığında ve belirtilen üst bilgi dosyası için eşleşen bir üst bilgi birimi dosyası (.ifc) mevcut olduğunda, derleyici üst bilgi dosyasını olarak #includeişlemek yerine üst bilgi birimini içeri aktarır. Bağımlılıkları tara ile birleştirildiğinde, derleyici üst bilgi birimlerinde derlenebilir tüm üst bilgi dosyalarını bulur. Hangi üst bilgi dosyalarının üst bilgi birimlerinde derlenebileceğine karar vermek için derleyici tarafından bir izin verilenler listesine başvurulur. Bu liste, eklenen dosyayla aynı dizinde olması gereken bir header-units.json dosyada depolanır. Visual Studio yükleme dizininin altında bir header-units.json dosya örneği görebilirsiniz. Örneğin, %ProgramFiles%\Microsoft Visual Studio\2022\Enterprise\VC\Tools\MSVC\14.30.30705\include\header-units.json derleyici tarafından bir Standart Şablon Kitaplığı üst bilgisinin bir üst bilgi biriminde derlenip derlenemediğini belirlemek için kullanılır. Bu işlev, üst bilgi birimlerinin bazı avantajlarından yararlanmak için eski koda sahip bir köprü işlevi görür.

Dosya header-units.json iki amaca hizmet eder. Hangi üst bilgi dosyalarının üst bilgi birimlerine derlenebileceğini belirtmeye ek olarak, derleme aktarım hızını artırmak için yinelenen sembolleri en aza indirir. Sembol yinelemesi hakkında daha fazla bilgi için bkz . C++ header-units.json başvurusu.

Bu anahtarlar ve , header-unit.json üst bilgi birimlerinin avantajlarından bazılarını sağlar. Kolaylık, derleme aktarım hızı maliyetinden gelir. En iyi derleme sürelerini garanti etmediğinden bu yaklaşım daha büyük projeler için en iyi yöntem olmayabilir. Ayrıca, aynı üst bilgi dosyaları tekrar tekrar yeniden işlenebilir ve bu da derleme süresini artırır. Ancak, projeye bağlı olarak kolaylık buna değer.

Bu özellikler eski kodlar için tasarlanmıştır. Yeni kod için üst bilgi birimleri veya #include dosyalar yerine modüllere gidin. Modülleri kullanma öğreticisi için bkz. Ad modülleri öğreticisi (C++).

Bu tekniğin STL üst bilgi dosyalarını üst bilgi birimi olarak içeri aktarmak için nasıl kullanıldığına ilişkin bir örnek için bkz . İzlenecek yol: STL kitaplıklarını üst bilgi birimi olarak içeri aktarma.

Önişlemci etkileri

Üst bilgi birimleri oluşturmak ve kullanmak için standart C99/C++11 uyumlu ön işlemci gereklidir. Derleyici, üst bilgi birimlerini derlerken yeni C99/C++11 uyumlu önişlemciyi, herhangi bir biçimi /exportHeader kullanıldığında komut satırına örtük olarak ekleyerek /Zc:preprocessor etkinleştirir. Kapatmaya çalışmak derleme hatasına neden olur.

Yeni ön işlemcinin etkinleştirilmesi, variadic makroların işlenmesini etkiler. Daha fazla bilgi için Variadic makro açıklamaları bölümüne bakın.

Ayrıca bkz.

/translateInclude
/exportHeader
/headerUnit
header-units.json
Üst bilgi birimlerini, modülleri ve önceden derlenmiş üst bilgileri karşılaştırma
C++ içindeki modüllere genel bakış
Öğretici: Modülleri kullanarak C++ standart kitaplığını içeri aktarma
İzlenecek yol: STL kitaplıklarını üst bilgi birimi olarak içeri aktarma