Aracılığıyla paylaş


Rehber: Microsoft C++ uygulamasında başlık dosyalarını oluşturma ve içeri aktarma

Bu makale, Visual Studio 2022 ile başlık birimleri oluşturma ve içeri aktarma hakkındadır. C++ standart kitaplık başlıklarını başlık birimleri olarak içeri aktarmayı öğrenmek için STL kitaplıklarını başlık birimi olarak içeri aktarma rehberi'ne bakın. 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. Bunun, bir #include dosyanın nasıl ele alınacağından farklı olduğunu 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. .ifc dosyasını ve onu içeri aktaran programı aynı derleyiciyle derlediğiniz sürece ve aynı platform ile mimariyi hedeflediğinizde, bir bilgisayarda üretilen bir ü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, .pch'den bir büyüklük derecesine kadar daha küçük 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. Bazı modüllerin sağladığı avantajları sunarlar. 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ı açığa çıkardığından (modüller bunu yapmaz), ü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. Başlık dosyalarıyla özel uygulamayı göstermek için, isimlerin önüne alt çizgi ekleyerek veya unsurları bir uygulama ad alanına yerleştirerek 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ş başlık dosyalarınızı başlık 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.

Başlık birimini 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 adımlarını görmek için Başlık birimleri için başlık birimi statik kütüphane projesi oluşturma bölümüne bakın.

  • Üst bilgi birimlerine çevrilecek dosyaları tek tek seçin. Bu yaklaşım, hangi dosyaların üst bilgi birimi olarak ele alındığını denetlemenizi sağlar. Ayrıca, varsayılan uzantısı (.ixx, .cppm, .h, .hpp) olmadığından normalde bir başlık birimi olarak derlenmeyecek bir dosyayı başlık birimi olarak 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 verimliliğini garanti etmediğinden daha küçük projelere daha uygundur. 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 aktarabilirsiniz ve kodunuzu yeniden yazmadan STL kitaplık üst bilgilerini otomatik olarak #include olarak işleyip import gibi değerlendirebilirsiniz. Nasıl yapıldığını görmek için İzlenecek Yol: STL kitaplıklarını başlık birimleri 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, önce C++ Dil Standardı'nı /std:c++20 veya daha yenisine ayarlayın ve bunu aşağıdaki adımlarla yapı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.

Başlık dosyasını başlık 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 projeyi bu kılavuzun ilerleyen bölümlerinde derlediğinizde, Pythagorean.h bir üst bilgi birimine dönüştürülür. Bir üst bilgi birimine çevrilmiştir çünkü bu üst bilgi dosyasının öğe türü C/C++ derleyicisi olarak ayarlanmıştır ve bu şekilde ayarlanan .h ve .hpp dosyaları için varsayılan eylem dosyayı bir üst bilgi birimine çevirmektir.

Not

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

Başlık birimini içeri aktarmak için kodunuzu değiştirin

  1. Örnek proje için kaynak dosyasında, #include "Pythagorean.h" öğesini import "Pythagorean.h"; ile değiştirin; noktalı virgülü unutmadan. İfadeler için import gereklidir. Bu, projenin yerel dizinindeki bir başlık dosyası olduğundan, import ifadesinde tırnak işaretleri kullandık: import "file";. Kendi projelerinizde, bir sistem başlığından bir başlık birimi derlemek için açılı ayraçları kullanın: import <file>;

  2. Ana menüdeki Derle>Çözümü Derle seçeneklerinden birini seçerek çö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, İzlenecek yol: STL kitaplıklarını üst bilgi birimi olarak içeri aktarma'ya bakın.

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ği Çevir, İçeri Aktarmalar ile birleştiğinde, aynı dizinde bulunan bir header-units.json dosyasında da belirtilmiş olan kaynak kodunuzda yer alan tüm üst bilgi dosyaları, üst bilgi birimlerine derlenir.
  • Includes’ı İçe Aktarım Olarak Çevir işlevi, bir üstbilgi dosyasına başvuruyorsa ve bu dosya bir üstbilgi birimi dosyası olarak derlenebiliyorsa #include (bu özellik header-units.json dosyalarında belirtildiği gibi) üstbilgi dosyası için derlenmiş bir üstbilgi birimi mevcut olduğunda dosyayı bir üstbilgi dosyası olarak ele alır. Aksi takdirde, üst bilgi dosyası normal #includeolarak değerlendirilir. header-units.json dosyası, semboller tekrarlanmadan her bir #include için başlık 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 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 seçilir, Dahil Etmeleri İçeri Aktarmalara Çevir vurgulanır ve Evet (/translateInclude) olarak seçilir

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 .ixx sahip dosyalar ve Dosya özellikleri>C/C++>Derleme Olarak özelliği C++ Başlık Birimi Olarak Derle (/export) 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. Eğer /translateInclude belirtilirse, derleyici ayrıca header-units.json dosyada da belirtilen #include yönergelerini başlık birimleri olarak ele almak üzere tarar. Bağımlılık grafiği, projenizdeki tüm modüllerden ve üst bilgi birimlerinden oluşturulur.
  • Dahil Etmeleri İthalatlara Çevir Derleyici bir #include deyimle karşılaştığında ve belirtilen başlık dosyası için eşleşen bir başlık birimi dosyası (.ifc) mevcut olduğunda, derleyici başlık dosyasını #include olarak işlemek yerine başlık birimini ithal eder. Bağımlılıkları tara ile birleştirildiğinde, derleyici başlık birimlerinde derlenebilir tüm başlık 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, derleyici, Standart Şablon Kütüphanesi başlık dosyasının bir başlık biriminde derlenip derlenemeyeceğini belirlemek için %ProgramFiles%\Microsoft Visual Studio\2022\Enterprise\VC\Tools\MSVC\14.30.30705\include\header-units.json kullanır. Bu işlev, başlık birimlerinin bazı avantajlarından yararlanmak amacıyla eski kod ile 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 ile header-unit.json, üst bilgi birimlerinin avantajlarından bazılarını sağlar. Kolaylık, derleme aktarım hızının azalması pahasına 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 Modül adları öğ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, herhangi bir formda /exportHeader kullanıldığında, /Zc:preprocessor’yi komut satırına örtük olarak ekleyerek yeni C99/C++11 uyumlu önişlemciyi 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