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

Visual Studio 2010'da bir proje başlattığımda stdafx.h adlı bir dosya otomatik olarak oluşturulur. Platformlar arası bir C++ kütüphanesi yapmam gerekiyor, bu yüzden bu başlık dosyasını kullanmıyorum/kullanamıyorum.

stdafx.h` ne için kullanılır? Bu başlık dosyasını kaldırmamın bir sakıncası var mı?

Çözüm

Tüm C++ derleyicilerinin başa çıkması gereken ciddi bir performans sorunu vardır. C++ kodunu derlemek uzun ve yavaş bir süreçtir.

C++ dosyalarının üzerine eklenen başlıkları derlemek çok uzun ve yavaş bir süreçtir. Windows API ve diğer büyük API kütüphanelerinin bir parçasını oluşturan devasa başlık yapılarını derlemek çok, çok uzun ve yavaş bir süreçtir. Her bir Cpp kaynak dosyası için bunu tekrar, tekrar ve tekrar yapmak zorunda kalmak bir ölüm çanıdır.

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

Microsoft derleyicisi bu sorunu önceden derlenmiş başlıklar adı verilen basit bir hile ile giderebilir. Bu hile oldukça kurnazcadır: her CPP dosyası potansiyel olarak ve yasal olarak her Cpp dosyasının üstüne dahil edilen başlık dosyaları zincirine biraz farklı bir anlam verebilse de (farklı makroların dahil edilenlerden önce #define'd edilmesi veya başlıkların farklı sırayla dahil edilmesi gibi şeylerle), çoğu zaman durum böyle değildir. Çoğu zaman, düzinelerce veya yüzlerce dahil edilmiş dosyamız vardır, ancak bunların hepsinin uygulamanızda derlenen tüm Cpp dosyaları için aynı anlama sahip olması amaçlanmıştır.

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

İşin püf noktası, tüm derleme zincirlerinin başlangıç noktası olarak özel bir başlık dosyası belirlemekten ibarettir; bu dosya, tarihsel nedenlerden dolayı genellikle stdafx.h adlı bir dosyadır.

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

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

Bu numaranın Microsoft derleyicilerine özgü olduğuna inanmıyorum ve orijinal bir gelişme olduğunu da düşünmüyorum.

Microsoft derleyicileri için, önceden derlenmiş başlıkların kullanımını kontrol eden ayar, derleyiciye verilen bir komut satırı argümanı tarafından kontrol edilir: /Yu "stdafx.h". Tahmin edebileceğiniz gibi, stdafx.h dosya adının kullanımı sadece bir gelenektir; isterseniz adı değiştirebilirsiniz.

Visual Studio 2010'da, bu ayar GUI'den bir CPP Projesine sağ tıklanarak, 'Özellikler' seçilerek ve "Yapılandırma Özellikleri\C/C++\Önceden Derlenmiş Üstbilgiler" seçeneğine gidilerek kontrol edilir. 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 bunları desteklemeyen bir araçla çalıştırırsanız), bunun programınızı yasa dışı hale getirmediğini unutmayın; bu sadece aracınızın her seferinde her şeyi sıfırdan derleyeceği anlamına gelir.

Windows bağımlılığı olmayan bir kütüphane oluşturuyorsanız, stdafx.h dosyasından #includes öğesini kolayca yorumlayabilir veya kaldırabilirsiniz. Dosyayı kendi başına kaldırmaya gerek yoktur, ancak yukarıdaki ön derleme başlığı ayarını devre dışı bırakarak bunu da yapabilirsiniz.

Yorumlar (16)

Bu bir "önceden derlenmiş başlık dosyası" -- stdafx.h dosyasına eklediğiniz tüm başlıklar sonraki derlemeler sırasında zaman kazanmak için önceden işlenir. Bu konuda daha fazla bilgi edinebilirsiniz MSDN'de.

Platformlar arası bir uygulama oluşturuyorsanız, projenizi oluştururken "Empty project" seçeneğini işaretleyin ve Visual Studio projenize hiçbir dosya koymaz.

Yorumlar (2)

Kendime çıplak kemik bir çerçeve oluşturmaya çalıştığım için bununla karşılaştım, ancak Visual Studio 2017'de yeni bir Win32 Program seçeneği oluşturarak başladım. "stdafx.h" gereksizdir ve kaldırılmalıdır. Ardından, Çözüm Gezgini'nizdeki aptal "stdafx.h" ve "stdafx.cpp" dosyalarını projenizden kaldırabilirsiniz. Onun yerine şunları koymanız gerekir

#include 

onun yerine.

Yorumlar (0)