Visual Studio'da “stdafx.h” ne için kullanılır?


500

stdafx.hVisual Studio 2010'da bir projeye başladığımda adlı bir dosya otomatik olarak oluşturulur. Platformlar arası bir C ++ kitaplığı yapmam gerekiyor, bu nedenle bu başlık dosyasını kullanamıyorum / kullanamıyorum.

Ne için stdafx.hkullanılır? Bu başlık dosyasını kaldırmam uygun olur mu?


2
Stdafx.h ile ilgili derleme hatası alırsam, genellikle ayarları bu dosyayı oluşturmak veya kullanmak için
ayarlıyorum

6
Makale: Acemi'ler

Üstbilgi dosyasını diğer platformlarda iyi kullanabilirsiniz, onlara normal bir üstbilgi dosyasıdır. Orada hiçbir performans avantajı sunmuyor.
Andrea

Yanıtlar:


826

Tüm C ++ derleyicileri ile başa çıkmak için ciddi bir performans sorunu var. C ++ kodunu derlemek uzun ve yavaş bir işlemdir.

C ++ dosyalarının üstündeki derleme başlıkları çok uzun ve yavaş bir işlemdir. Windows API ve diğer büyük API kitaplıklarının bir parçasını oluşturan büyük başlık yapılarını derlemek çok , çok uzun ve yavaş bir işlemdir. Her Cpp kaynak dosyası için tekrar tekrar yapmak zorunda kalmak bir ölüm şövalyesi.

Bu, Windows'a özgü değildir, ancak Windows gibi büyük bir API'ye karşı derlemek zorunda olan tüm derleyicilerin karşılaştığı eski bir sorundur.

Microsoft derleyicisi, önceden derlenmiş üstbilgiler adı verilen basit bir hile ile bu sorunu giderebilir . Hile oldukça kaygan: Her CPP dosyası potansiyel ve yasal olarak her bir Cpp dosyasının üstündeki üstbilgi dosyaları zincirine biraz farklı bir anlam verebilir; başlıkları farklı sırayla ekleyerek), çoğu zaman böyle değildir. Çoğu zaman, düzinelerce veya yüzlerce dahil edilmiş dosyamız vardır, ancak bunların hepsi uygulamanızda derlenen tüm Cpp dosyaları için aynı anlama sahiptir.

Derleyici, her Cpp dosyasını ve her seferinde sıfırdan düzinelerce derlemeyi derlemeye başlamak zorunda kalmazsa büyük zaman tasarrufu sağlayabilir.

Püf noktası, derleme zincirlerinin başlangıç ​​noktası olarak özel bir üstbilgi dosyası olarak tanımlanmaktan ibarettir. Bu, genellikle geçmiş nedenlerle stdafx.h adlı bir dosya olan 'önceden derlenmiş üstbilgi' dosyası olarak adlandırılır .

API'larınız için tüm büyük büyük başlıklarınızı uygun sırayla stdafx.h dosyanızda listeleyin ve ardından #include "stdafx.h"anlamlı bir içerikten önce en üstte CPP dosyalarınızın her birini en üstte bir ile başlatın (daha önce izin verilen tek şey yorum).

Bu koşullar altında , derleyici sıfırdan başlamak yerine, her şeyi derlemek için önceden kaydedilmiş sonuçlardan derlemeye başlar stdafx.h.

Bu hilenin Microsoft derleyicilerine özgü olduğuna inanmıyorum, ne de orijinal bir gelişme olduğunu düşünüyorum.

: Microsoft derleyicinde önderlenmiş başlıkların kontrolleri kullanımı derleyiciye bir komut satırı argümanı ile kontrol edilmesidir ayarı için /Yu "stdafx.h". Tahmin edebileceğiniz gibi, stdafx.hdosya adının kullanımı sadece bir kuraldır; İsterseniz adı değiştirebilirsiniz.

Visual Studio 2010'da, bu ayar bir CPP Projesi'ne sağ tıklayıp 'Özellikler'i seçip "Yapılandırma Özellikleri \ C / C ++ \ Önceden Derlenmiş Üstbilgiler" e giderek GUI'den denetlenir. Visual Studio'nun diğer sürümleri için, GUI'deki konum farklı olacaktır.

Önceden derlenmiş başlıkları devre dışı bırakırsanız (veya projenizi desteklemeyen bir araçla çalıştırırsanız) programınızı yasadışı yapmaz; bu, aracınızın her şeyi sıfırdan derleyeceği anlamına gelir.

Hiçbir, Windows bağımlılıkları ile bir kütüphane oluşturuyorsanız, kolayca kaldır dışarı veya edebilirsiniz #includelar dan stdafx.hdosyası. Dosyayı kendi başınıza kaldırmanıza gerek yoktur, ancak yukarıdaki önceden derlenmiş başlık ayarını devre dışı bırakarak da bunu açıkça yapabilirsiniz.


6
Sadece std ad alanından dosyalar için kullansanız bile hız avantajı elde edersiniz
Ghita

11
omg, gerçekten çok güzel bir cevap. standart uyumlu c derleyici arıyordu. proje özelliklerinden mikro $ oft uzantılarını devre dışı bırakabileceğim, derleyiciyi "auto" dan "c" ye değiştirebileceğim ve hemen hemen "standart" derleyici ve IDE'ye sahip olduğum ortaya çıkıyor.
EKanadily

4
@Rishi: 'çizgi' ile mi demek istiyorsun #include "stdafx.h"? Tabii, ama bu sadece standart bir #include. "MS uzantılı" kısmı sadece bir derleyici performans optimizasyonudur; "stdafx.h" olarak adlandırılan bir başlık dosyasına sahip olmanın anlambilimini değiştirmez. Dahil etmeyi kaldırırsanız ve kodunuz stdafx.h aracılığıyla eklenen herhangi bir şeye bağlıysa, doğrudan eklemeniz gerekeceğini unutmayın.
Euro Micelli

4
@ Youda008, tam olarak doğru değil. Bir kod dosyasını derlemeden önce, üstbilgilerin içeriği basit ve tam anlamıyla #includekaynak dosyada bulunduğunuz noktaya " makrolar" (makroları değerlendiren aynı 'önişlemci' adımı ile yapılır) yapıştırılır . Sonuçta elde edilen toplam dosya daha sonra asıl derleyiciye aktarılır; bu, bir üstbilgi dosyasını asla ayrı bir varlık olarak görmez. Yalnızca üstbilgi dosyasına bildirimler koyabilirsiniz, çünkü bir üstbilgi dosyasında iyi sonuç veren şey budur - bu geleneksel bir kuraldır. Dene! Bir programın tamamını içeren bir başlık dosyası oluşturun, ardından yalnızca #include içeren bir kaynak dosya oluşturun. İyi derler.
Euro Micelli

28
Tarihsel merak. Stdafx.h adı, MFC'nin piyasaya sürülmesinden önce 'Uygulama Çerçevesi Uzantıları' olarak adlandırıldığı 1992 yılından kalmadır. Visual Studio 2015 hala varsayılan adı ..
kert

48

Bu bir "önceden derlenmiş başlık dosyası" dır - stdafx.h dosyasına eklediğiniz tüm başlıklar, sonraki derlemeler sırasında zaman kazanmak için önceden işlenir. Bununla ilgili daha fazla bilgiyi buradan MSDN'de bulabilirsiniz .

Platformlar arası bir uygulama oluşturuyorsanız, projenizi oluştururken "Boş proje" seçeneğini işaretlediğinizde Visual Studio projenize hiç dosya koymaz.


15
Bu dosyada başka platformlarda çalışmayan hiçbir şey yok. Derleyici önceden derlenmiş üstbilgileri desteklemiyorsa, derlemeyi yavaşlatabilir, ancak bunu kırmamalıdır. Bu, yalnızca diğer başlık dosyalarını içeren bir başlık dosyasıdır.
16'da detunized

2
@detunized: Belki cevabım başka türlü geldiğini söyledi, bu yüzden bu kısmı açıkladığınız için teşekkürler.
casablanca


-10

Kendimi çıplak kemikler çerçevesi oluşturmaya çalıştığımdan beri kendime koştum, ancak Visual Studio 2017'de yeni bir Win32 Programı seçeneği oluşturarak başladım. "Stdafx.h" gereksiz ve kaldırılmalıdır. Ardından, Çözüm Gezgini'nde bulunan aptal "stdafx.h" ve "stdafx.cpp" öğelerini ve projenizdeki dosyaları kaldırabilirsiniz. Onun yerine koymanız gerekecek

#include <Windows.h>

yerine.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.