Apa itu "unit terjemahan" dalam C ++

236

Saya membaca pada saat itu "C ++ Efektif" yang ditulis oleh Meyers dan menemukan istilah "unit terjemahan".

Bisakah seseorang tolong beri saya penjelasan tentang:

1) Apa sebenarnya itu

2) Kapan saya harus mempertimbangkan menggunakannya saat pemrograman dengan C ++

3) Jika hanya terkait dengan C ++, atau dapat digunakan dengan bahasa pemrograman lain

Saya mungkin sudah menggunakannya tanpa mengetahui istilah ....

Harry
sumber
1
2. Anda sudah menggunakan unit terjemahan jika Anda sudah memasukkan file header. Ini adalah istilah yang digunakan untuk referensi dan bukan c ++ konstruk per say
talekeDskobeDa

Jawaban:

268

Dari sini : ( tautan mesin wayback )

Menurut standar C ++ ( tautan mesin wayback ): Unit terjemahan adalah unit dasar kompilasi dalam C ++. Ini terdiri dari konten file sumber tunggal, ditambah konten file header apa pun yang secara langsung atau tidak langsung dimasukkan olehnya, dikurangi garis-garis yang diabaikan menggunakan pernyataan preprocessing bersyarat.

Satu unit terjemahan dapat dikompilasi menjadi file objek, pustaka, atau program yang dapat dieksekusi.

Gagasan unit terjemahan paling sering disebutkan dalam konteks Aturan Definisi Satu, dan templat.

JeffH
sumber
9
Apakah istilah hanya digunakan dalam C / C ++?
dekuShrub
2
@dekuShrub sebenarnya, tidak. Sebagai contoh, di Rust, unit terjemahan adalah peti, dalam C ++ hal yang sama akan disebut sebagai seluruh perpustakaan. Istilah itu sendiri bersifat universal, tetapi pasti dimulai dengan C.
Sahsahae
Referensi baru yang secara kasar menyatakan apa yang dinyatakan oleh jawaban ini: en.wikipedia.org/wiki/Translation_unit_(programming)
Gabriel Staples
67

Unit terjemahan untuk semua maksud dan tujuan file (.c / .cpp), setelah selesai termasuk semua file header.

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

Ana Betts
sumber
3
Termasuk file header. File header diproses oleh kompiler, bahkan jika tidak ada kode yang dihasilkan. Lihat juga komentar preprosesor JeffH, definisi "semua yang dilihat kompilator" adalah definisi yang bagus.
Marco van de Voort
10
Anda dapat mengkompilasi file yang diakhiri dengan ".h". Nama file tidak penting sama sekali. Isinya. Jika konten "foo.h" adalah "int main () {}" Anda dapat mengompilasinya.
Johannes Schaub - litb
@LightnessRacesinOrbit: Ya, apa yang saya coba katakan adalah tidak ortodoks untuk secara langsung mengkompilasi header sebagai TU, daripada secara tidak langsung mengkompilasinya menjadi TU melalui inklusi. Menghapus komentar pertama karena salah, menjaga komentar kedua untuk memberikan yang baru.
GManNickG
1
@GManNickG: Bagaimana "file .h secara konvensional tidak diumpankan langsung ke kompiler."
Lightness Races dalam Orbit
@ JohannesSchaub-litb Saya pikir maksud Anda tautan, bukan kompilasi. Anda dapat mengkompilasi file apa pun asalkan C / C ++ sudah sesuai dengan semua nama yang ditentukan. Akan sia-sia untuk mengkompilasi file header karena seluruh titik file header harus dimasukkan (baca disalin) ke dalam file sumber, jadi mereka sudah dikompilasi ketika Anda mengkompilasi file sumber yang menyertakannya. Saya kira apa yang ingin Anda katakan adalah bahwa Anda tidak dapat membuat executable dari file yang tidak memiliki fungsi utama.
pooya13
30

Sebuah pertanyaan sulit untuk dijawab secara pasti. Status standar C ++:

Teks program disimpan dalam unit yang disebut file sumber dalam Standar Internasional ini. File sumber bersama dengan semua header (17.4.1.2) dan file sumber yang disertakan (16.2) melalui arahan preprocessing #include, dikurangi setiap baris sumber dilewati oleh salah satu arahan preprocessing inklusi kondisional (16.1), disebut unit terjemahan. [Catatan: program C ++ tidak semua harus diterjemahkan pada waktu yang bersamaan. ]

Jadi untuk sebagian besar maksud dan tujuan, unit terjemahan adalah file sumber C ++ tunggal dan header atau file lain yang disertakan melalui mekanisme preprocessor #include.

Mengenai pertanyaan Anda yang lain:

2) Kapan saya harus mempertimbangkan menggunakannya saat pemrograman dengan C ++

Anda tidak dapat tidak mempertimbangkannya - unit terjemahan adalah dasar dari program C ++.

3) Jika hanya terkait dengan C ++, atau dapat digunakan dengan bahasa pemrograman lain

Bahasa lain memiliki konsep yang serupa, tetapi semantiknya akan sedikit berbeda. Sebagian besar bahasa lain tidak menggunakan preprosesor, misalnya.

Ondrej Slinták
sumber
1
Saya tidak tahu apakah itu menjelaskan atau tidak. Ini bisa menjadi area yang agak keruh - tidak jelas dari para paragraf standar yang saya kutip dari header yang telah dikompilasi sebelumnya, misalnya.
1
@ GM, dan di situlah Anda harus sangat berhati-hati tentang aturan satu definisi. Jika Anda menyertakan kelas dalam unit terjemahan yang berbeda dengan definisi yang sedikit berbeda sebelum kelas tersebut dimasukkan yang menyebabkan kelas memiliki kode yang berbeda, itu akan menyebabkan masalah yang tidak ditentukan.
Harga Matt
6
@ GM dapat mencatat dua istilah yang digunakan oleh Standar: "header" dan "file sumber". "header" hanya digunakan untuk pustaka Standar. File pengguna yang disertakan oleh beberapa kode tidak disebut "header" oleh Standar, tetapi "file sumber". Standar tidak tahu tentang perbedaan antara "H" dan "Cpp" bahwa kita miskin c ++ programmer terdiri :)
Johannes Schaub - litb
8

Buku itu membuatnya cukup jelas. Ketika Meyers merujuk ke "Unit terjemahan", ia berarti file kode sumber.

Ed S.
sumber
1
Tidak. Jika dia berbicara tentang kode sumber dia akan mengatakan file sumber. Unit terjemahan dibuat dengan menyusun kode sumber. Perhatikan perbedaannya. Ini adalah kode sumber "Diterjemahkan".
Dan
3
@ Dan: Tidak, tidak. Unit terjemahan adalah file sumber setelah termasuk yang dapat dikompilasi, yaitu, output dari preprocessor sebelum kompilasi.
Ed S.
1
Bahkan, terlepas dari apa yang disebut standar C ++, "unit terjemahan" biasanya digunakan untuk mengkomunikasikan ide "Unit" tunggal dari kode yang dikompilasi. Bahkan menurut para kompiler Microsoft, Anda menautkan "Unit Terjemahan" secara langsung. msdn.microsoft.com/en-us/library/vstudio/…
Dan
1
Jadi apakah kita berusaha untuk menjadi "C ++ standard" atau kita mencoba untuk membantu orang berkomunikasi dengan industri lainnya? Saya tahu ini adalah utas C ++ jadi saya tidak akan masuk ke apa yang disebut xcode tu. Atau semua definisi lain dari istilah tersebut.
Dan
1
@Dan: Unit terjemahan adalah apa yang disebut standar. Saya tidak benar-benar peduli dengan pendapat devs compiler acak. Menarik bahwa orang yang menggali pos hampir lima tahun untuk nitpick dan memberi tahu saya bahwa definisi saya salah berbalik dan memanggil saya "bahasa nazi" untuk mengoreksi nya. Yeesh, teruskan, Anda lelah berurusan dengan.
Ed S.
4

Selain ODR, unit terjemahan penting dalam definisi ruang nama tanpa nama, yang menggantikan salah satu penggunaan lama "statis".

Saya kira saya masih belum memiliki cukup poin untuk menambahkan komentar di bawah jawaban teratas.

Allan Stokes
sumber
3

Unit terjemahan adalah kode yang diteruskan ke kompilator dengan benar. Ini biasanya berarti keluaran dari menjalankan preprosesor pada file .c.

sigjuice
sumber
2

Program C dan C ++ terdiri dari satu atau lebih file sumber, yang masing-masing berisi beberapa teks program. File sumber, bersama dengan file yang disertakan (file yang disertakan menggunakan arahan #include preprocessor) tetapi tidak termasuk bagian kode yang dihapus oleh arahan kompilasi-kondisional seperti #jika, disebut "unit terjemahan."

ganesh marmat
sumber
1

Menurut MSDN : Program C dan C ++ terdiri dari satu atau lebih file sumber, yang masing-masing berisi beberapa teks program. File sumber, bersama dengan file yang disertakan (file yang disertakan menggunakan arahan #include preprocessor) tetapi tidak termasuk bagian kode yang dihapus oleh arahan kompilasi-kondisional seperti #jika, disebut "unit terjemahan."

rahul
sumber
0

Setiap file cpp / c (implementasi) akan dikonversi menjadi unit terjemahan (mis., File objek (.obj)) header dalam file cpp akan diganti dengan teks aktual dari file header.

yesraaj
sumber
0

Seperti yang dikatakan orang lain, unit terjemahan pada dasarnya adalah isi dari file sumber setelah preprocessing. Ini adalah produksi teratas dalam tata bahasa; Anda hanya perlu khawatir tentang hal itu jika Anda menulis kompiler C atau C ++.

John Bode
sumber
1
"Anda hanya perlu khawatir tentang hal itu jika Anda menulis kompiler C atau C ++." Saya tidak setuju: programmer sering perlu memahami apa yang dikerjakan oleh kompiler. Jadi, misalnya, Anda perlu tahu apa itu unit terjemahan untuk memahami poin penting dari Butir 5 di Efektif C ++: "urutan relatif inisialisasi objek statis non-lokal yang didefinisikan dalam unit terjemahan berbeda tidak ditentukan".
Channing Moore