2010-04-29 31 views
7

Có thư viện C nguồn mở phù hợp để lưu trữ và thao tác
biến động được nhập (biến thể a.k.a.) không? Tôi chủ yếu quan tâm đến các giá trị nguyên tử (int8, int16, int32, uint, strings, blobs, vv), trong khi các mảng và đối tượng JSON cũng như các đối tượng tùy chỉnh cũng sẽ tốt đẹp. Một trường hợp quan trọng trong đó một thư viện như vậy sẽ hữu ích khi làm việc với các cơ sở dữ liệu SQL.Thư viện kiểu dữ liệu biến thể cho C

Tính năng rõ ràng nhất của một thư viện như vậy sẽ là một loại duy nhất cho tất cả các giá trị được hỗ trợ, ví dụ:

struct Variant { 
    enum Type type; 
    union { 
     int8_t int8_; 
     int16_t int16_; 
     // ... 
    }; 
}; 

Các tính năng khác có thể bao gồm chuyển đổi Ngôn ngữ địa phương đối tượng đến/từ các cấu trúc C (sử dụng một bảng ràng buộc), chuyển đổi các giá trị thành/từ các chuỗi và tích hợp với một thư viện cơ sở dữ liệu hiện có như SQLite.

Lưu ý: Tôi không tin đây là câu hỏi trùng lặp với Any library for generic datatypes in C?, đề cập đến "hàng đợi, cây cối, bản đồ, danh sách". Những gì tôi đang nói về tập trung nhiều hơn vào việc làm việc với các cơ sở dữ liệu SQL gần như trơn tru như làm việc với chúng trong các ngôn ngữ thông dịch.

+0

Biến thể? C sử dụng 'void *' cho điều đó ... – kennytm

+0

@KennyTM: Tôi không nghĩ rằng 'void *' là một nền tảng thích hợp cho một hàm như PHP 'sqlite_fetch_object' bắt chước trong C (không viết/sử dụng một thư viện biến thể hoặc tương tự). –

+1

Tôi không nghĩ từ "nguyên tử" nghĩa là ý nghĩa của từ đó. – JXG

Trả lời

-4

C là một ngôn ngữ được đánh máy rất mạnh, các biến thể không phải là một phần của triết lý của nó. Công đoàn không thể là giải pháp vì bạn vẫn phải chọn loại dữ liệu bạn muốn sử dụng, thường được sử dụng để lưu trữ mã màu trên intchar[4].

Nếu bạn nhìn vào giao diện C-SQLite, chức năng này được cung cấp:

int sqlite_step(
    sqlite_vm *pVm,   /* The virtual machine to execute */ 
    int *pN,     /* OUT: Number of columns in result */ 
    const char ***pazValue, /* OUT: Column data */ 
    const char ***pazColName /* OUT: Column names and datatypes */ 
); 

Các kiểu dữ liệu được đại diện bởi char * và đó là nhiệm vụ của nhà phát triển để tìm cách để có được các loại từ này. Tôi nghĩ rằng bất kỳ loại biến thể nào sẽ tốt hơn nhưng nó không phải là C. C không thực hiện các biến thể và không có nghĩa là.

+3

C được * nhập * tĩnh nhưng không được nhập "rất". – kennytm

+3

Không gõ mạnh. Một khi bạn giới thiệu đúc đến và từ void * bạn thực hiện một lỗ trong hệ thống kiểm tra loại. C chắc chắn KHÔNG được gõ mạnh. –

+0

Như những người khác đã nói, một phần về "gõ mạnh" là đồng bằng sai. – choeger

0

Tôi khuyên bạn nên đọc hướng dẫn sử dụng trên trình kết nối cơ sở dữ liệu SQL. Trình kết nối MySQL cung cấp một API để lấy các kiểu trường trong kết quả .

Bạn có thể tạo hàm Nhà máy lấp đầy cấu trúc dựa trên loại trường. Trớ trêu thay, vì C không có kiểu Base, bạn sẽ phải sử dụng một con trỏ void * và recast đến kiểu cấu trúc đã biết. (Mặc dù void * là loại bạn đang cố gắng để thoát khỏi.)

+0

Tôi đã làm một cái gì đó tương tự như thế này bằng cách tạo ra một hệ thống ràng buộc mà đặt biến tham chiếu bởi 'void *' con trỏ. Tôi không sợ 'void *', tôi chỉ muốn một khuôn khổ đơn giản để làm việc với các kiểu động trong C. –

3

Mặc dù tôi nghi ngờ rằng tác giả ban đầu vẫn nhu cầu một câu trả lời (hy vọng ít nhất là sau 4 năm), tôi muốn thêm 2ct của tôi. Trước tiên, hãy để tôi nói rằng điều bạn yêu cầu được gọi là một loại tổng và thường được hỗ trợ trong các ngôn ngữ chức năng (nghĩa là, nó là một tính năng thiết kế ngôn ngữ chứ không phải vấn đề thư viện). Thứ hai, rất nghi ngờ rằng bạn sẽ tìm thấy một thư viện C cho trường hợp đó vì lý do đơn giản là bất kỳ thư viện nào như vậy sẽ hỗ trợ một tập hợp các biến thể cố định có thể không phù hợp với nhu cầu của bạn.

Howerver, vì mục đích hoàn chỉnh, bạn có thể muốn thử msgpack.

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