Eğer iken edebilir dahil.cpp
Bahsettiğiniz gibi dosyaları, bu kötü bir fikir.
Bahsettiğiniz gibi, bildirimler başlık dosyalarına aittir. Bunlar, uygulamaları içermediği için çoklu derleme birimlerine dahil edildiğinde sorun yaratmaz. Bir işlev veya sınıf üyesinin tanımını birden çok kez eklemek normalde bir soruna neden olur (ancak her zaman değil) çünkü bağlayıcı karışır ve bir hata atar.
Ne olmalı her biri .cpp
dosya programın bir alt kümesi için sınıf, mantıksal olarak organize edilmiş fonksiyonlar grubu, global statik değişkenler (hiç değilse az kullanılır) vb.
Her derleme birimi (.cpp
dosya) daha sonra içerdiği tanımları derlemek için gereken bildirimleri içerir. Başvurduğu ancak içermediği işlevleri ve sınıfları izler, böylece bağlayıcı daha sonra nesne kodunu bir yürütülebilir dosya veya kitaplıkla birleştirdiğinde bunları çözebilir.
Misal
Foo.h
-> Foo sınıfı için bildirim (arayüz) içerir.
Foo.cpp
-> Foo sınıfı için tanım (uygulama) içerir.
Main.cpp
-> ana yöntemi, program giriş noktasını içerir. Bu kod bir Foo başlatır ve kullanır.
Hem Foo.cpp
ve Main.cpp
ihtiyaç içerecek şekilde Foo.h
. Foo.cpp
sınıf arayüzünü destekleyen kodu tanımladığı için buna ihtiyaç duyar, bu yüzden bu arayüzün ne olduğunu bilmelidir.Main.cpp
buna bir Foo yarattığı ve davranışını çağırdığı için ihtiyaç duyuyor, bu yüzden bu davranışın ne olduğunu, bir Foo'nun hafızadaki boyutunu ve işlevlerini nasıl bulabileceğini vb. bilmeli ama henüz gerçek uygulamaya ihtiyacı yok.
Derleyici üretecektir Foo.o
gelen Foo.cpp
derlenmiş biçimde Foo sınıf kodu tüm ihtiva etmektedir. Ayrıca Main.o
, ana yöntemi ve sınıf Foo'ya çözülmemiş referansları içeren üretir .
Şimdi iki nesne dosyasını Foo.o
ve Main.o
yürütülebilir bir dosyada birleştiren bağlayıcı geliyor . Çözümlenmemiş Foo referanslarını Main.o
görüyor, ancak Foo.o
gerekli sembolleri içeriyor, bu yüzden "noktaları birleştiriyor". Bir işlev çağrısı Main.o
artık derlenen kodun gerçek konumuna bağlanır, böylece çalışma zamanında program doğru konuma atlayabilir.
Foo.cpp
Dosyayı içine dahil etseydiniz, Foo sınıfının iki tanımı Main.cpp
olurdu . Bağlayıcı bunu görür ve "Hangisini seçeceğimi bilmiyorum, bu yüzden bu bir hata." Derleme adımı başarılı olur, ancak bağlantı kurulamaz. (Derlemediğiniz sürece neden ayrı bir dosyadadır?)Foo.cpp
.cpp
Son olarak, farklı dosya türleri fikri bir C / C ++ derleyicisiyle alakasızdır. İstenen dil için geçerli kod içeren "metin dosyalarını" derler. Bazen dili, dosya uzantısına göre söyleyebilir. Örneğin, .c
derleyici seçeneği olmayan bir dosyayı derleyin ve C .cc
veya .cpp
varsayalım, C ++ olduğunu varsayar. Ancak, bir derleyiciye C ++ olarak bir dosyayı .h
bile derlemesini söyleyebilirim .docx
ve .o
düz metin biçiminde geçerli C ++ kodu içeriyorsa bir object ( ) dosyası yayar . Bu uzantılar daha çok programcının yararınadır. Eğer görürsem Foo.h
ve Foo.cpp
derhal ilkinin sınıfın bildirisini, ikincisinin de tanımı içerdiğini varsayarım.