İlk olarak, ilk sorgunuzu ele almak için:
Bunu .h dosyasında gördüğünüzde :
#ifndef FILE_H
#define FILE_H
/* ... Declarations etc here ... */
#endif
Bu, bir başlık dosyasının birden çok kez dahil edilmesini önleyen, çeşitli nedenlerle sorun yaratabilecek bir önişlemci tekniğidir. Projenizin derlenmesi sırasında, her .cpp dosyası (genellikle) derlenir. Basit bir deyişle, bu derleyicinin .cpp dosyanızı alacağı , herhangi bir dosyayı açacağı #included
, hepsini tek bir büyük metin dosyasına birleştireceği ve sözdizimi analizi gerçekleştireceği ve nihayetinde bazı ara koda dönüştüreceği, diğerlerini optimize edeceği / gerçekleştireceği anlamına gelir ve son olarak hedef mimari için derleme çıktısı oluşturun. Bu nedenle, bir dosya #included
bir .cpp altında birden çok isedosyasında, derleyici dosya içeriğini iki kez ekleyecektir, bu nedenle bu dosyada tanımlar varsa, bir değişkeni yeniden tanımladığınızı bildiren bir derleyici hatası alırsınız. Dosya derleme işlemindeki önişlemci adımı tarafından işlendiğinde, içeriğine ilk erişildiğinde ilk iki satır FILE_H
önişlemci için tanımlanmış olup olmadığını kontrol eder . Değilse FILE_H
, kod ile #endif
yönerge arasındaki kodu tanımlayacak ve işlemeye devam edecektir . Dosyanın içeriği önişlemci tarafından bir dahaki sefer görüldüğünde, kontrol FILE_H
işlemi yanlış olur, bu yüzden hemen aşağıya doğru taranır #endif
ve devam eder. Bu yeniden tanımlama hatalarını önler.
İkinci endişenizi gidermek için:
Genel bir uygulama olarak C ++ programlamasında geliştirmeyi iki dosya türüne ayırıyoruz. Biri .h uzantılıdır ve buna "başlık dosyası" diyoruz. Genellikle işlevler, sınıflar, yapılar, global değişkenler, typedefs, önişleme makroları ve tanımları vb. Bildirirler. Temel olarak, size sadece kodunuz hakkında bilgi sağlarlar. Sonra "kod dosyası" dediğimiz .cpp uzantısına sahibiz. Bu, bu işlevler, sınıf üyeleri, tanımlara ihtiyaç duyan tüm yapı üyeleri, genel değişkenler vb. İçin tanımlar sağlar. Böylece .h dosyası kodu bildirir ve .cpp dosyası bu bildirimi uygular. Bu nedenle, genellikle derleme sırasında her bir .cpp(neredeyse tek görmek asla çünkü bir nesnenin dosya ve daha sonra bu nesneleri bağlamak .Cpp dosya başka dahil .cpp dosyası).
Bu dışsalların nasıl çözüldüğü bağlayıcı için bir iştir. Sizin derleyici işlediğinde main.cpp , bu kod için bildirimleri alır class.cpp dahil ederek class.h . Sadece bu işlevlerin veya değişkenlerin neye benzediğini bilmek gerekir (bu bir bildirimin size verdiği şeydir). Bu yüzden main.cpp dosyanızı bir nesne dosyasına derler ( main.obj olarak adlandırın ). Benzer şekilde, class.cpp bir derlendi class.objdosya. Son yürütülebilir dosyayı üretmek için, bu iki nesne dosyasını birbirine bağlamak için bir bağlayıcı çağrılır. Çözülmemiş harici değişkenler veya işlevler için derleyici, erişimin gerçekleştiği yere bir saplama yerleştirir. Bağlayıcı daha sonra bu saplamayı alır ve listelenen başka bir nesne dosyasındaki kodu veya değişkeni arar ve bulunursa, iki nesne dosyasındaki kodu bir çıktı dosyasına birleştirir ve saplamayı işlevin son konumu ile değiştirir veya değişken. Bu şekilde, main.cpp içindeki kodunuz işlevleri çağırabilir ve class.cpp dosyasındaki değişkenleri kullanabilir VE SADECE class.h .
Umarım bu yardımcı olmuştur.