2013-05-07 28 views
10

Từ §6.2.7.5 (trang 66):Loại hỗn hợp trong C là gì?

VÍ DỤ Căn cứ vào hai tập tin phạm vi khai báo sau:

int f(int (*)(), double (*)[3]); 
int f(int (*)(char *), double (*)[]); 

Kết quả là loại composite cho các chức năng là:

int f(int (*)(char *), double (*)[3]); 

Trên ví dụ, họ giải thích rằng một loại hỗn hợp là một loại, tương thích với hai loại khác nhau. Tôi sẽ hiểu trực giác cụm từ "loại hỗn hợp" có nghĩa là "cấu trúc và công đoàn", có vẻ như là lối tắt.

Loại hỗn hợp trong C và loại được sử dụng để làm gì? Ai đó có thể vui lòng giải thích ví dụ ở trên chi tiết?

+3

Tôi nghĩ bạn có nghĩa là §6.2.7? – unwind

+0

Bạn có cân nhắc việc di chuyển lên trên văn bản ở trên ví dụ đó (6.2.7/3) ở đâu, đáng ngạc nhiên, định nghĩa của kiểu kết hợp được nêu? – Lundin

+0

Có, 6.2.7, sai lầm của tôi. Tôi đọc định nghĩa (hai lần), nhưng không hiểu nó. Tôi thậm chí còn nhầm lẫn về cách "double (*) [3]" sẽ được sử dụng. – Vorac

Trả lời

5

Tôi trực giác sẽ hiểu cụm từ "hợp gõ" như ý nghĩa "cấu trúc và các đoàn thể", mà dường như là cách off-mục tiêu.

Trong định nghĩa ngôn ngữ C, mảng và cấu trúc là tổng hợp loại (loại bao gồm nhiều phần tử). Công đoàn là loại động vật của chính họ, vì họ chỉ có thể nhận giá trị của một nguyên tố tại một thời điểm.

Loại kết hợp có nhiều vấn đề hơn đối với người triển khai trình biên dịch chứ không phải là các mã khỉ chạy.Bạn và tôi sẽ không cố gắng xác định loại hỗn hợp hoặc khai báo các đối tượng thuộc loại đó.

Trong ví dụ đã cho, bạn có hai khai báo phạm vi tệp cho hàm f hơi khác nhau. Dựa trên các quy tắc được trình bày trong 6.2.7/3, trình biên dịch xác định loại hoạt động cho cả hai, như vậy nó có thể thực thi ngữ nghĩa kiểu tại thời gian biên dịch (tức là, bất kỳ cuộc gọi nào đến f đều có thể được kiểm tra đúng cách, ngay cả với các khai báo hơi khác nhau) và tạo mã máy thích hợp để gọi hàm.

6

Tôi lẽ không phải là người thích hợp để trả lời câu này, nhưng đối với những gì nó có giá trị, đây là lý do căn C99, mà có thể hữu ích:

6.2.7 loại tương thích và composite loại

Các khái niệm về loại tương thích và loại hỗn hợp đã được giới thiệu để cho phép C89 thảo luận về những tình huống trong đó các khai báo kiểu không cần phải giống nhau. Các điều khoản này đặc biệt hữu ích trong việc giải thích mối quan hệ giữa loại không đầy đủ và loại đã hoàn thành. Với việc bổ sung các mảng chiều dài biến (§6.7.5.2) vào C99, khả năng tương thích kiểu mảng được mở rộng sao cho các mảng chiều dài biến tương thích với cả mảng có kích thước cố định và một mảng có kiểu không đầy đủ.

Cấu trúc, công đoàn, hoặc kiểu liệt kê tờ khai trong hai đơn vị dịch khác nhau không chính thức tuyên bố cùng loại, thậm chí nếu văn bản của các tờ khai xuất phát từ các tập tin tiêu đề tương tự, vì các đơn vị dịch thuật đều tự rời nhau. Tiêu chuẩn do đó, chỉ định các quy tắc tương thích bổ sung cho các loại đó sao cho hai tờ khai như vậy là tương thích nếu chúng tương tự nhau.

ĐỔI yên tĩnh ở C99

cấu trúc hoặc khai báo kiểu công đoàn trong các đơn vị dịch khác nhau bây giờ phải có thẻ giống hệt nhau để tương thích.