Một đơn vị dịch thuật tiếng Nhật là gì trong C ++


236

Tôi đang đọc vào thời điểm "C ++ hiệu quả" được viết bởi Meyers và bắt gặp thuật ngữ "đơn vị dịch thuật".

Ai đó có thể xin vui lòng cho tôi một lời giải thích về:

1) Chính xác nó là gì

2) Khi nào tôi nên cân nhắc sử dụng nó khi lập trình với C ++

3) Nếu nó chỉ liên quan đến C ++, hoặc nó có thể được sử dụng với các ngôn ngữ lập trình khác

Tôi có thể đã sử dụng nó mà không biết thuật ngữ ....


1
2. Bạn đã sử dụng đơn vị dịch nếu bạn đã bao gồm các tệp tiêu đề. Đây là một thuật ngữ được sử dụng để tham khảo và không phải là cấu trúc c ++ mỗi lần nói
talekeDskobeDa

Câu trả lời:


268

Từ đây : ( liên kết máy wayback )

Theo tiêu chuẩn C ++ ( liên kết máy wayback ): Đơn vị dịch là đơn vị biên dịch cơ bản trong C ++. Nó bao gồm các nội dung của một tệp nguồn duy nhất, cộng với nội dung của bất kỳ tệp tiêu đề nào được bao gồm trực tiếp hoặc gián tiếp bởi nó, trừ đi các dòng bị bỏ qua khi sử dụng các câu lệnh tiền xử lý có điều kiện.

Một đơn vị dịch thuật có thể được biên dịch thành tệp đối tượng, thư viện hoặc chương trình thực thi.

Khái niệm về một đơn vị dịch thuật thường được đề cập nhất trong các ngữ cảnh của Quy tắc Một Định nghĩa và các mẫu.


9
Là thuật ngữ chỉ được sử dụng trong C / C ++?
dekuShrub

2
@dekuShrub là một vấn đề thực tế, không. Ví dụ, trong Rust, một đơn vị dịch là một cái thùng, trong C ++, điều tương tự sẽ được gọi là toàn bộ thư viện. Bản thân thuật ngữ này là phổ quát, nhưng nó chắc chắn bắt đầu bằng C.
Sahsahae

Tài liệu tham khảo mới nêu gần đúng những gì câu trả lời này nêu: en.wikipedia.org/wiki/Translation_unit_(programming)
Gabriel Staples

67

Một đơn vị dịch dành cho tất cả ý định và mục đích của một tệp (.c / .cpp), sau khi hoàn thành bao gồm tất cả các tệp tiêu đề.

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


3
Bao gồm các tập tin tiêu đề. Các tệp tiêu đề được xử lý bởi trình biên dịch, ngay cả khi không có mã nào được tạo. Xem thêm bình luận tiền xử lý của JeffH, định nghĩa "mọi thứ trình biên dịch nhìn thấy" là một ý kiến ​​hay.
Marco van de Voort

10
Bạn có thể biên dịch các tệp kết thúc bằng ".h". Tên tập tin không quan trọng chút nào. Nội dung là. Nếu nội dung của "foo.h" là "int main () {}", bạn có thể biên dịch nó.
Julian Schaub - litb

@LightnessRacesinOrbit: Vâng, điều tôi đã cố gắng nói là không chính thống để biên dịch trực tiếp một tiêu đề dưới dạng TU, thay vì gián tiếp biên dịch nó thành TU thông qua việc đưa vào. Đã xóa bình luận đầu tiên vì đã sai rõ ràng, giữ bình luận thứ hai để đưa ra bối cảnh mới của chúng tôi.
GManNickG

1
@GManNickG: Làm thế nào về "các tệp .h thường không được cung cấp trực tiếp cho trình biên dịch."
Các cuộc đua nhẹ nhàng trong quỹ đạo

@ JohannesSchaub-litb Tôi nghĩ bạn có nghĩa là liên kết, không biên dịch. Bạn có thể biên dịch bất kỳ tệp nào miễn là đúng C / C ++ với tất cả các tên được xác định. Sẽ là vô ích khi biên dịch tệp tiêu đề vì toàn bộ điểm của tệp tiêu đề sẽ được đưa vào (đọc đã sao chép) vào các tệp nguồn, vì vậy chúng đã được biên dịch khi bạn biên dịch tệp nguồn có chứa nó. Tôi đoán điều bạn muốn nói là bạn không thể tạo một tệp thực thi từ một tệp không có chức năng chính.
pooya13

30

Một câu hỏi khó trả lời dứt khoát. Tiêu chuẩn C ++ nêu rõ:

Văn bản của chương trình được lưu giữ trong các đơn vị gọi là tệp nguồn trong Tiêu chuẩn quốc tế này. Một tệp nguồn cùng với tất cả các tiêu đề (17.4.1.2) và các tệp nguồn được bao gồm (16.2) thông qua chỉ thị tiền xử lý #include, ít hơn bất kỳ dòng nguồn nào bị bỏ qua bởi bất kỳ chỉ thị tiền xử lý bao gồm có điều kiện (16.1) nào, được gọi là đơn vị dịch. [Lưu ý: một chương trình C ++ không cần phải được dịch cùng một lúc. ]

Vì vậy, đối với hầu hết các mục đích và mục đích, một đơn vị dịch thuật là một tệp nguồn C ++ duy nhất và tiêu đề hoặc các tệp khác mà nó bao gồm thông qua cơ chế tiền xử lý #include.

Về các câu hỏi khác của bạn:

2) Khi nào tôi nên cân nhắc sử dụng nó khi lập trình với C ++

Bạn không thể xem xét nó - các đơn vị dịch thuật là nền tảng của chương trình C ++.

3) Nếu nó chỉ liên quan đến C ++, hoặc nó có thể được sử dụng với các ngôn ngữ lập trình khác

Các ngôn ngữ khác có khái niệm tương tự, nhưng ngữ nghĩa của chúng sẽ khác nhau một cách tinh tế. Hầu hết các ngôn ngữ khác không sử dụng bộ tiền xử lý, ví dụ.


1
Tôi không biết nếu điều đó làm rõ hay không. Đây có thể là một khu vực hơi âm u - không rõ ràng từ đoạn tiêu chuẩn mà tôi đã trích dẫn từ các tiêu đề được biên dịch trước đó được cho phép, ví dụ.

1
@GMan, và đó là nơi bạn phải rất cẩn thận về quy tắc một định nghĩa. Nếu bạn bao gồm một lớp trong các đơn vị dịch thuật khác nhau với các định nghĩa hơi khác nhau trước khi lớp đó được đưa vào khiến lớp có mã khác nhau, nó sẽ gây ra các vấn đề không xác định.
Matt Giá

6
@GMan lưu ý hai thuật ngữ được sử dụng bởi Tiêu chuẩn: "tiêu đề" và "tệp nguồn". "tiêu đề" chỉ được sử dụng cho thư viện Chuẩn. Một tệp người dùng được bao gồm bởi một số mã không được gọi là "tiêu đề" theo Tiêu chuẩn, mà là "tệp nguồn". Tiêu chuẩn không biết về sự khác biệt giữa ".h" và ".cpp" mà các lập trình viên c ++ nghèo của chúng tôi tạo ra :)
Johannes Schaub - litb

8

Cuốn sách làm cho nó đủ rõ ràng. Khi Meyers đề cập đến một "Đơn vị dịch thuật", anh ta có nghĩa là một tệp mã nguồn.


1
Không. Nếu anh ta nói về mã nguồn, anh ta sẽ nói các tệp nguồn. Đơn vị dịch được thực hiện bằng cách biên dịch mã nguồn. Lưu ý sự khác biệt rõ ràng. Đó là mã nguồn "Đã dịch".
Dan

3
@Dan: Không, không phải vậy. Một đơn vị dịch là một tệp nguồn sau bao gồm có thể được biên dịch, nghĩa là đầu ra của bộ tiền xử lý trước khi biên dịch.
Ed S.

1
Trong thực tế, mặc dù tiêu chuẩn C ++ gọi nó là gì, "đơn vị dịch" thường được sử dụng để truyền đạt ý tưởng về một "Đơn vị" mã được biên dịch. Trong thực tế, theo những người biên dịch Microsoft, bạn liên kết trực tiếp "Đơn vị dịch thuật". msdn.microsoft.com/en-us/l Library / vudio / từ
Dan

1
Vì vậy, chúng ta đang cố gắng trở thành những người nổi tiếng "tiêu chuẩn C ++" hay chúng ta đang cố gắng giúp mọi người giao tiếp với phần còn lại của ngành công nghiệp? Tôi biết đây là một chủ đề C ++ vì vậy tôi sẽ không đi sâu vào cái mà xcode gọi là tu. Hoặc tất cả các định nghĩa khác của thuật ngữ.
Dan

1
@Dan: Một đơn vị dịch thuật là những gì tiêu chuẩn gọi nó. Tôi không thực sự quan tâm đến ý kiến ​​của các nhà biên dịch ngẫu nhiên. Thật thú vị khi anh chàng đào một bài viết gần năm năm tuổi cho nitpick và nói với tôi rằng định nghĩa của tôi là sai và quay lại gọi tôi là "ngôn ngữ nazi" để sửa lỗi. Yeesh, di chuyển trên, bạn đang mệt mỏi để đối phó.
Ed S.

4

Ngoài ODR, đơn vị dịch thuật rất quan trọng trong định nghĩa về không gian tên không tên, thay thế một trong những cách sử dụng cũ của "tĩnh".

Tôi đoán tôi vẫn không có đủ điểm để thêm nhận xét dưới câu trả lời hàng đầu.


3

Một đơn vị dịch là mã được chuyển đến trình biên dịch thích hợp. Điều này thường có nghĩa là đầu ra từ việc chạy bộ tiền xử lý trên tệp .c.


2

Các chương trình C và C ++ bao gồm một hoặc nhiều tệp nguồn, mỗi tệp chứa một số văn bản của chương trình. Một tệp nguồn, cùng với các tệp bao gồm của nó (các tệp được bao gồm bằng chỉ thị tiền xử lý #include) nhưng không bao gồm các phần mã được xóa bởi các chỉ thị biên dịch có điều kiện như #if, được gọi là "đơn vị dịch".


1

Theo MSDN : Các chương trình C và C ++ bao gồm một hoặc nhiều tệp nguồn, mỗi tệp chứa một số văn bản của chương trình. Một tệp nguồn, cùng với các tệp bao gồm của nó (các tệp được bao gồm bằng chỉ thị tiền xử lý #include) nhưng không bao gồm các phần mã được xóa bởi các chỉ thị biên dịch có điều kiện như #if, được gọi là "đơn vị dịch".


0

Mỗi tệp cpp / c (hiện thực) sẽ được chuyển đổi thành một tiêu đề đơn vị dịch (ví dụ: tệp đối tượng (.obj)) trong tệp cpp sẽ được thay thế bằng văn bản thực tế từ các tệp tiêu đề.


0

Như những người khác đã nói, một đơn vị dịch thuật về cơ bản là nội dung của một tệp nguồn sau khi tiền xử lý. Đây là sản phẩm hàng đầu trong ngữ pháp ngôn ngữ; bạn sẽ chỉ cần lo lắng về nó nếu bạn đang viết một trình biên dịch C hoặc C ++.


1
"bạn sẽ chỉ cần lo lắng về nó nếu bạn đang viết trình biên dịch C hoặc C ++." Tôi không đồng ý: lập trình viên thường cần hiểu trình biên dịch đang làm gì. Vì vậy, ví dụ, bạn cần biết đơn vị dịch là gì để hiểu một điểm quan trọng từ Mục số 5 trong C ++ hiệu quả: "thứ tự khởi tạo tương đối của các đối tượng tĩnh không cục bộ được xác định trong các đơn vị dịch khác nhau không được xác định".
Channing Moore

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.