Có thể int (*)[]
là một loại không đầy đủ?
C 2018 6.2.5 1 nói:
Tại các điểm khác nhau trong một đơn vị dịch thuật, một loại đối tượng có thể không đầy đủ (thiếu thông tin đầy đủ để xác định kích thước của các đối tượng của loại đó) hoặc đầy đủ (có đủ thông tin).
Do đó, dường như nếu kích thước của một loại được biết đến, loại đã hoàn thành. 6.2.6.1 28 chỉ định rằng một số loại con trỏ nhất định phải có cùng kích thước (con trỏ tới void
và ký tự, con trỏ tới loại tương thích, con trỏ tới cấu trúc và con trỏ tới kết hợp), nhưng con trỏ tới các loại khác có thể khác nhau.
Trong một triển khai C trong đó tất cả các con trỏ hoặc tất cả các con trỏ tới các mảng int
đều có cùng kích thước, thì kích thước int (*)[]
được biết đến, vì vậy nó sẽ hoàn thành. Trong một triển khai, giả sử, sử dụng các con trỏ khác nhau cho các mảng lớn, kích thước sẽ không được biết đến, vì vậy nó không đầy đủ.
Như MM chỉ ra , cấu trúc không được chứa thành viên có loại không hoàn chỉnh, ngoại trừ thành viên mảng linh hoạt cuối cùng, theo một ràng buộc trong 6.7.2.1 3. Điều này cho thấy rằng việc triển khai với một kích thước con trỏ phải chấp nhận struct { int (*p)[]; }
trong khi việc triển khai có khác kích thước cho các mảng như vậy phải chẩn đoán vi phạm ràng buộc. (Điều này có nghĩa là một tuyên bố như vậy không phải là một phần của việc tuân thủ nghiêm ngặt C.)
void *
là hoàn thành cho thấy một con trỏ đến một loại không hoàn chỉnh có thể được hoàn thành. Nó không hiển thị liệu một con trỏ tới một loại không hoàn chỉnh có thể không đầy đủ hay không. Nếu người ta hỏi có thể một động vật có vú là một con voi không? Câu hỏi hỏi liệu bộ X của con trỏ thành loại không hoàn chỉnh có thể chứa một phần tử không đầy đủ không. Cho thấy tập hợp X của con trỏ thành kiểu không hoàn chỉnh chứa một phần tử hoàn chỉnh là không liên quan.