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.cppve Main.cppihtiyaç içerecek şekilde Foo.h. Foo.cppsı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.cppbuna 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.ogelen Foo.cppderlenmiş 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.ove Main.oyürütülebilir bir dosyada birleştiren bağlayıcı geliyor . Çözümlenmemiş Foo referanslarını Main.ogörüyor, ancak Foo.ogerekli sembolleri içeriyor, bu yüzden "noktaları birleştiriyor". Bir işlev çağrısı Main.oartık derlenen kodun gerçek konumuna bağlanır, böylece çalışma zamanında program doğru konuma atlayabilir.
Foo.cppDosyayı içine dahil etseydiniz, Foo sınıfının iki tanımı Main.cppolurdu . 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, .cderleyici seçeneği olmayan bir dosyayı derleyin ve C .ccveya .cppvarsayalım, C ++ olduğunu varsayar. Ancak, bir derleyiciye C ++ olarak bir dosyayı .hbile derlemesini söyleyebilirim .docxve .odü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.hve Foo.cppderhal ilkinin sınıfın bildirisini, ikincisinin de tanımı içerdiğini varsayarım.