C ++ 'da “çeviri birimi” nedir


236

Ben o zaman Meyers tarafından yazılmış ve “çeviri birimi” terimiyle karşılaşan “Etkili C ++” ı okuyorum.

Birisi bana bir açıklama yapabilir mi?

1) Tam olarak nedir

2) C ++ ile programlama yaparken ne zaman kullanmayı düşünmeliyim

3) Sadece C ++ ile ilişkili ise veya diğer programlama dilleriyle kullanılabilirse

Ben zaten terim bilmeden kullanabilirsiniz ....


1
2. Başlık dosyaları eklediyseniz, çeviri birimini zaten kullanıyorsunuzdur. Referans için kullanılan bir terimdir ve
sözde

Yanıtlar:


268

Gönderen burada : ( wayback makine bağlantı )

Standart C ++ 'a (geri dönüş makinesi bağlantısı ) göre: Bir çeviri birimi, C ++' da temel derleme birimidir. Koşullu önişleme ifadeleri kullanılarak yok sayılan satırlar hariç olmak üzere, tek bir kaynak dosyanın içeriğinin yanı sıra doğrudan veya dolaylı olarak dahil edilen başlık dosyalarının içeriğinden oluşur.

Tek bir çeviri birimi bir nesne dosyasına, kitaplığa veya yürütülebilir programa derlenebilir.

Bir çeviri birimi kavramı çoğunlukla Tek Tanım Kuralı bağlamında ve şablonlarda belirtilir.


9
Terim sadece C / C ++ 'da mı kullanılır?
dekuShrub

2
@dekuShrub aslında, hayır. Örneğin, Rust'da bir çeviri birimi bir sandıktır, C ++ 'da aynı şey tüm kütüphane olarak adlandırılır. Terimin kendisi evrenseldir, ama kesinlikle C ile başladı.
Sahsahae

Bu cevabın kabaca belirttiği yeni referans: en.wikipedia.org/wiki/Translation_unit_(programming)
Gabriel Staples

67

Bir çeviri birimi, tüm başlık dosyaları dahil olmak üzere bittikten sonra bir dosya (.c / .cpp) tüm amaçlara yöneliktir .

http://msdn.microsoft.com/en-us/library/bxss3ska%28VS.80%29.aspx


3
Başlık dosyaları dahil. Hiçbir kod oluşturulmasa bile, başlık dosyaları derleyici tarafından işlenir. Ayrıca bkz. JeffH'nin önişlemci yorumu, "derleyicinin gördüğü her şey" tanımı iyi bir şeydir.
Marco van de Voort

10
".H" ile biten dosyaları gayet iyi bir şekilde derleyebilirsiniz. Dosya adı hiç önemli değil. İçerik. "Foo.h" içeriği "int main () {}" ise, derleyebilirsiniz.
Johannes Schaub - litb

@LightnessRacesinOrbit: Evet, söylemeye çalıştığım şey, bir üstbilgiyi dolaylı olarak TU yoluyla dahil etme yoluyla derlemek yerine doğrudan TU olarak derlemenin alışılmışın dışında olmasıydı. İlk yorumu basit yanlış olduğu için sildi, ikincisini bağlamlarımıza verdik.
GManNickG

1
@GManNickG: ".h dosyaları geleneksel olarak derleyiciye doğrudan beslenmiyor."
Orbit'te Hafiflik Yarışları

@ JohannesSchaub-litb Sanırım bağlantı demek istiyorsun, derlemek değil. Tanımlanan tüm isimlerle uygun C / C ++ olduğu sürece herhangi bir dosyayı derleyebilirsiniz. Bir üstbilgi dosyasının bütün noktası kaynak dosyalara dahil edileceğinden (kopyalandı okunur) bir üstbilgi dosyası derlemek işe yaramaz olacaktır, bu nedenle onu içeren bir kaynak dosyasını derlediğinizde zaten derleniyorlar. Söylemek istediğim, ana işlevi olmayan bir dosyadan yürütülebilir bir dosya oluşturamamanızdır.
pooya13

30

Kesin cevap vermek zor bir soru. C ++ standardı şunları belirtir:

Program metni, bu standardda kaynak dosyaları adı verilen birimlerde tutulur. Ön işleme yönergesi #include ile tüm üstbilgiler (17.4.1.2) ve kaynak dosyalar (16.2) ile birlikte bir kaynak dosyasına, koşullu içerme (16.1) önişleme yönergelerinden herhangi biri tarafından atlanan herhangi bir kaynak hattı daha az çeviri birimi denir. [Not: Bir C ++ programının aynı anda çevrilmesi gerekmez. ]

Çoğu amaç ve amaç için, bir çeviri birimi tek bir C ++ kaynak dosyası ve üstbilgi veya içerdiği diğer dosyalar önişlemci #include mekanizması ile olur.

Diğer sorularınız için:

2) C ++ ile programlama yaparken ne zaman kullanmayı düşünmeliyim

Bunu düşünemezsiniz - çeviri birimleri bir C ++ programının temelidir.

3) Sadece C ++ ile ilişkili ise veya diğer programlama dilleriyle kullanılabilirse

Diğer diller benzer kavramlara sahiptir, ancak anlambilimleri oldukça farklı olacaktır. Diğer birçok dilde, örneğin önişlemci kullanılmaz.


1
Bunun açık olup olmadığını bilmiyorum. Bu biraz karanlık bir alan olabilir - örneğin, önceden derlenmiş başlıklardan alıntılanan standart paradan net değil.

1
@GMan ve tek bir tanım kuralı konusunda çok dikkatli olmanız gereken yer burası. Sınıfın farklı kodlara sahip olmasına neden olan sınıf dahil edilmeden önce, biraz farklı tanımlara sahip farklı çeviri birimlerine bir sınıf eklerseniz, tanımsız sorunlara neden olur.
Matt Price

6
@ Standart tarafından kullanılan iki terimi not edebilir: "başlık" ve "kaynak dosya". "başlık" yalnızca Standart kitaplık için kullanılır. Bazı kodların içerdiği bir kullanıcı dosyasına Standart tarafından "başlık" değil, "kaynak dosya" denir. Standart, yoksul c ++ programcılarının oluşturduğu ".h" ve ".cpp" arasındaki farkı bilmiyor :)
Johannes Schaub - litb

8

Kitap yeterince netleştiriyor. Meyers bir "çeviri Birimi" ne atıfta bulunursa, kaynak kod dosyası anlamına gelir.


1
Hayýr. Kaynak koddan bahsediyorsa, kaynak dosyalar derdi. Çeviri birimi kaynak kodu derlenerek yapılır. Farklı farka dikkat edin. "Çevrilmiş" kaynak kodudur.
Dan

3
@ Dan: Hayır, değil. Bir çeviri sonra cihaz içeren bir kaynak dosyası olabilir , yani, ön işlemci çıkış önce derleme için derlenmelidir.
Ed S.

1
Aslında, C ++ standardının dediği şeye rağmen, "çeviri birimi" derlenmiş kodun tek bir "Birim" fikrini iletmek için yaygın olarak kullanılır. Aslında Microsoft derleyici adamlara göre, doğrudan "Çeviri Birimleri" bağlantı. msdn.microsoft.com/tr-tr/library/vstudio/…
Dan

1
Peki "C ++ standardı" naziler olmaya mı çalışıyoruz yoksa insanların sektörün geri kalanıyla iletişim kurmasına mı yardımcı oluyoruz? Bu bir C ++ iş parçacığı olduğunu biliyorum, bu yüzden ne xcode bir tu çağırır gitmek olmaz. Veya terimin diğer tüm tanımları.
Dan

1
@ Dan: Bir çeviri birimi standardın dediği şeydir. Rastgele derleyici devs görüşüyle ​​gerçekten ilgilenmiyorum. İlginçtir, nitpick'e neredeyse beş yaşındaki bir postayı kazıp tanımımın yanlış olduğunu söyleyen adam dönüyor ve düzeltmek için bana bir "dil nazi" diyor. Yeesh, devam et, uğraşmaya yoruldun.
Ed S.

4

ODR'ye ek olarak, çeviri birimi, "statik" in eski kullanımlarından birinin yerini alan adsız ad alanlarının tanımında önemlidir.

Üst yanıtın altına yorum eklemek için hala yeterli puanım yok sanırım.


3

Bir çeviri birimi derleyiciye uygun şekilde geçirilen koddur. Bu genellikle, ön işlemciyi .c dosyasında çalıştırmaktan kaynaklanan çıktı anlamına gelir.


2

C ve C ++ programları, her biri program metninin bir kısmını içeren bir veya daha fazla kaynak dosyasından oluşur. Kaynak dosyası, içerdiği dosyalarla (#include önişlemci yönergesi kullanılarak dahil edilen) ancak #if gibi koşullu derleme yönergeleri tarafından kaldırılan kod bölümlerini içermeyen bir dosyaya "çeviri birimi" denir.


1

MSDN'ye göre : C ve C ++ programları, her biri program metninin bir kısmını içeren bir veya daha fazla kaynak dosyasından oluşur. Kaynak dosyası, içerdiği dosyalarla (#include önişlemci yönergesi kullanılarak dahil edilen) ancak #if gibi koşullu derleme yönergeleri tarafından kaldırılan kod bölümlerini içermeyen bir dosyaya "çeviri birimi" denir.


0

Her cpp / c (uygulama) dosyası, cpp dosyasındaki bir çeviri birimine (yani, nesne dosyası (.obj)) dönüştürülecek ve başlık dosyalarındaki gerçek metin ile değiştirilecektir.


0

Diğerlerinin söylediği gibi, bir çeviri birimi temel olarak önişlemeden sonra bir kaynak dosyanın içeriğidir. Dil gramerinde en üst düzey prodüksiyon; bunun için sadece bir C veya C ++ derleyicisi yazıyorsanız endişelenmeniz gerekir.


1
"yalnızca bir C veya C ++ derleyicisi yazıyorsanız bu konuda endişelenmeniz gerekir." Kabul etmiyorum: programcılar genellikle derleyicinin ne yaptığını anlamalıdır. Bu nedenle, örneğin, Etkili C ++ 'da Madde 5'teki önemli bir noktayı anlamak için bir çeviri biriminin ne olduğunu bilmeniz gerekir: "farklı çeviri birimlerinde tanımlanan yerel olmayan statik nesnelerin göreli olarak başlatılma sırası tanımsız".
Channing Moore

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.