2012-04-29 36 views
8

Trong C++, bạn có thể có cả vùng chứa chung và loại an toàn bằng cách sử dụng mẫu. Tuy nhiên, trong C, nếu bạn muốn các thùng chứa chung, bạn phải (afaik) sử dụng void*, có nghĩa là bạn bị mất an toàn loại. Để có các thùng chứa loại an toàn, bạn sẽ phải triển khai lại chúng cho mọi loại dữ liệu bạn muốn giữ.Trong C, Container Chung hoặc Thùng chứa An toàn?

Cho rằng C sau một hơn the-trình-biết-gì-he's-làm triết lý hơn so với C++, những gì sẽ là điều thành ngữ hơn để làm trong C: sử dụng container chung với void*, hoặc làm cho container tùy chỉnh cho mọi loại dữ liệu?

Trả lời

3

tôi muốn nhắm container generic:

  1. Một khi bạn đã quen với nó, bạn chỉ nghĩ về void * được có nghĩa là loại một cái gì đó khi tôi không quan tâm đến loại của nó. Nó giống như Object trong Java - ở đâu, trong một thời gian dài, các thùng chứa chung không có loại an toàn.

  2. Bạn chỉ có một nơi để cải tiến.

  3. Bạn không nhận được loại an toàn; nhưng với việc triển khai lặp lại các loại thùng chứa an toàn, bạn có nguy cơ bị sao chép và dán các lỗi. Điều đó cũng có thể dẫn đến lỗi.

0

Để tạo một loại xử lý dữ liệu chung trong C, bạn sẽ sử dụng void* để chuyển dữ liệu xung quanh. Việc xác định các thuật toán mới cho từng loại có thể là không thực tế.

+0

Vâng, bạn sẽ chỉ xác định các thuật toán bạn cần. Nhưng tôi thấy những gì bạn đang nói. –

+0

@PaulManta: Vâng, tôi đã đi tắt của ví dụ chứa mà nên xử lý các loại tùy ý. –

0

bạn đã không có lợi ích thực sự cho việc sử dụng void* như một thành viên (trừ khi, nói, thời gian biên dịch là quan trọng nhất), bạn luôn có thể đúc để void* nơi thích hợp, sau đó hoạt động trên blobs dữ liệu untyped khi cần thiết.

tôi đã triển khai các giao diện như vậy trong C (ví dụ: nhiều biến thể với các trường có tên thuộc các loại khác nhau). tôi thích có loại an toàn, và hiếm khi tìm thấy đúc để void* một điều tốt trong những triển khai.

... sau đó một lần nữa, tôi dành nhiều thời gian viết C++ hơn c :)

0

Vì vậy, tôi đã có một tìm kiếm nhanh để xem nếu có những ý tưởng thông minh mới đã nổi lên trong lĩnh vực container C.

Tôi tìm thấy this. Đó là một nỗ lực khá kỹ lưỡng tại một thư viện chứa C hoàn chỉnh.

Nó di chuyển xung quanh các phần tử được chứa trong các con trỏ void *. Không có cố gắng để xác định cấu trúc của một loại cụ thể.

Đối với loại an toàn, COULD viết macro "bao bọc" cho mỗi vùng chứa, xác định máy chủ nếu các hàm nội tuyến quấn quanh một phiên bản chưa được phân loại và cung cấp loại an toàn. Hy vọng rằng chúng sẽ được tối ưu hóa bởi trình biên dịch, nhưng điều này không phải lúc nào cũng có thể. Và các macro sẽ là xấu xí.

Tôi đoán đây là một trong những lý do tại sao nhiều chương trình (ứng dụng) được viết bằng C++ thay vì C. Khả năng tạo trừu tượng phức tạp trong C bị hạn chế. Bạn có thể làm điều đó nhưng bạn thường hy sinh các khía cạnh khác như hiệu suất hoặc bảo trì (ví dụ, hãy xem chương trình C GTK).

+0

Với sự mới '_Generic' từ khóa của C11, những macro ý kiến ​​với nhau là quá xấu xí, trên thực tế. Clang đã thực hiện điều này, và gcc cũng có đủ tính năng để mô phỏng nó. –

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