Định nghĩa thường được sử dụng của đơn vị dịch là những gì xuất hiện sau khi xử lý trước (bao gồm các tệp tiêu đề, macro, v.v. cùng với tệp nguồn). Định nghĩa này là hợp lý rõ ràng và tiêu chuẩn C, 5.1.1.1, C11, nói:Đơn vị dịch chính xác là gì ở C
Một chương trình C không cần phải dịch cùng một lúc. Văn bản của chương trình được lưu giữ trong các đơn vị được gọi là các tệp nguồn, (hoặc các tệp tiền xử lý) trong tiêu chuẩn này. Tệp nguồn cùng với tất cả các tiêu đề và tệp nguồn được bao gồm qua chỉ thị tiền xử lý
#include
được biết đến như một đơn vị dịch tiền xử lý. Sau khi tiền xử lý, một đơn vị dịch tiền xử lý được gọi là đơn vị dịch thuật.
Đọc câu đầu tiên chặt chẽ hơn:
Một chương trình C cần không phải tất cả được dịch cùng một lúc.
trong đó hàm ý (để đọc sách của tôi), một chương trình C thể được dịch đồng mà không nhất thiết phải tách chúng thành nhiều file nguồn tiền xử lý. Cũng ở cuối cùng một đoạn, tiêu chuẩn cho biết:
Đơn vị dịch có thể được dịch riêng và sau đó được liên kết để tạo chương trình thực thi.
có thể (và thường là) được hiểu là biên dịch các tệp đối tượng riêng lẻ và sau đó liên kết chúng để tạo ra một chương trình thực thi duy nhất. Tuy nhiên, nếu người ta có thể làm cho một câu hỏi ra khỏi tuyên bố trên và yêu cầu: có nghĩa là một thực hiện là miễn phí để xem xét nhiều file nguồn như một đơn vị dịch duy nhất, đặc biệt đối với một lời gọi như:
gcc file1.c file2.c -o out
nơi trình biên dịch có quyền truy cập vào toàn bộ nguồn?
Cụ thể, nếu việc triển khai xử lý file1.c
+ file2.c
(ở trên) dưới dạng đơn vị dịch đơn, có thể coi là không phù hợp không?
Tiêu chuẩn có nghĩa đen không có gì để nói về giải thích của GCC về các đối số dòng lệnh của GCC. Đó là bình thường trong phạm vi của ISO C, vì vậy nó thậm chí không được thực hiện xác định trong ý nghĩa của tiêu chuẩn. –
Hoàn toàn có thể viết mã phù hợp để biên dịch và liên kết sạch miễn là hai tệp được coi là đơn vị dịch riêng biệt, nhưng sẽ không biên dịch được nếu chúng được coi là một TU Ví dụ, các tệp có thể xác định chức năng tĩnh có cùng tên; nếu được coi là một TU đơn, thì hỗn hợp sẽ có chức năng đó được định nghĩa nhân. –
@IwillnotexistIdonotexist GCC (cộng với thư viện, nền tảng vv) là một * triển khai * và liệu, nếu có, GCC (hoặc bất kỳ trình biên dịch nào) làm như vậy sẽ được coi là không phù hợp là câu hỏi. Trong thực tế, không có gì trong câu hỏi hỏi về hành vi của GCC khác bằng cách sử dụng nó như là một ví dụ cho lệnh biên dịch. – usr