2014-12-09 20 views
11

Tôi đã thấy loại void[] được sử dụng ở một vài nơi trong tài liệu D và các chữ ký chức năng. Nó có nghĩa là gì?void [] là gì?

Tôi đã tìm kiếm phần mảng trong tài liệu cũng như Google, nhưng không bật lên bất kỳ điều gì kết luận. Tất cả những gì tôi thấy là tất cả các mảng được chuyển đổi hoàn toàn thành loại void[]. Nó chỉ là một mảng không định dạng?

Trả lời

12

void[] chỉ là một mảng của bất kỳ thứ gì. in void[] là chữ ký thuận tiện cho hàm chỉ ghi byte vào tệp hoặc thứ gì đó vì nó sẽ chấp nhận bất kỳ loại mảng nào - void nghĩa là loại không quan trọng và in có nghĩa là bạn không có ý định sửa đổi hoặc lưu trữ nó. bạn chấp nhận const hoặc mảng bất biến quá.

Để sử dụng void[], trước tiên bạn phải truyền cho một thứ khác, thông thường, ubyte[], vì vậy các phần tử có kích thước cụ thể cho phép bạn lập chỉ mục. void[].length được cho là tổng số byte trong mảng, vì vậy nếu bạn chỉ cần truyền một con trỏ và chiều dài của dữ liệu vào một hàm (như ghi tệp cấp hệ điều hành, ví dụ: write syscall của Linux), hãy chuyển số arr.ptr, arr.length mà không quan tâm đến những gì họ đại diện.

+1

Tôi cũng nên đề cập đến các loại khoảng trống khác mà bạn có thể thấy: 'void *', có nghĩa là con trỏ đến bất kỳ thứ gì. 'void *' là phổ biến trong C cho cùng một loại thứ 'void []' được sử dụng trong D (và nhiều hơn một chút, C sử dụng void * ở một số nơi D sẽ sử dụng mẫu hoặc lớp/giao diện quá - cho dữ liệu chung .) 'void *' cũng có thể trong D và đôi khi được ghép nối với một đối số 'TypeInfo', cho phép các generics thời gian chạy. Mẫu thường tốt hơn, nhưng có một số phần của thư viện thời gian chạy D sử dụng cặp void * + TypeInfo thay thế (chủ yếu vì lý do lịch sử). Vì vậy, bạn có thể thấy nó ở đó. –

+0

Xem thêm http://forum.dlang.org/post/[email protected] – o3o

Các vấn đề liên quan