2010-04-29 16 views
7

Czy istnieje przyzwoita biblioteka C z otwartym źródłem do przechowywania i manipulowania zmiennymi dynamicznie wpisanymi (warianty a.k.a.)? Interesują mnie przede wszystkim wartości atomowe (int8, int16, int32, uint, smings, blobs itp.), A także macierze w stylu JSON i obiekty oraz obiekty niestandardowe. Ważnym przypadkiem, w którym taka biblioteka byłaby przydatna, jest praca z bazami danych SQL.Biblioteka typów typów danych dla C

Najbardziej oczywistym cechą takiej biblioteki byłby pojedynczy typ dla wszystkich obsługiwanych wartości, np

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

Inne cechy mogą obejmować przekształcenie Wariant obiektów do/z struktury C (stosując tabelę wiążącą) konwersja wartości do/z ciągów i integracja z istniejącą biblioteką baz danych, taką jak SQLite.

Uwaga: nie wierzę, że to jest pytanie, to duplikat numeru Any library for generic datatypes in C?, który odnosi się do "kolejek, drzew, map, list". To, o czym mówię, koncentruje się bardziej na tym, aby praca z bazami danych SQL była równie sprawna, jak praca z nimi w językach interpretowanych.

+0

Wariant? C używa 'void *' do tego ... – kennytm

+0

@KennyTM: Nie sądzę, że 'void *' jest odpowiednim fundamentem dla funkcji, takiej jak PHP 'sqlite_fetch_object' naśladowanej w C (bez pisania/używania biblioteki wariantów lub podobnej). –

+1

Nie sądzę, że słowo "atomowy" oznacza to, co według ciebie oznacza. – JXG

Odpowiedz

-4

C to bardzo silny język maszynowy, warianty nie są częścią jego filozofii. Związek nie może być rozwiązaniem, ponieważ nadal musisz wybrać typ danych, którego chcesz użyć, zwykle jest używany do przechowywania kodów kolorów na int i char[4].

Jeśli spojrzeć na interfejs C-SQLite, funkcja ta jest:

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 */ 
); 

typy danych są reprezentowane przez char * i to zadanie dewelopera dowiedzieć jak dostać się z tych typów. Myślę, że każdy rodzaj wariantu byłby lepszy, ale to po prostu nie C. C nie implementuje wariantów i nie jest przeznaczony do tego.

+3

C jest * statycznie * wpisane, ale nie "bardzo" mocno wpisane. – kennytm

+3

Brak silnego pisania. Po wprowadzeniu rzucania do i od pustki * robisz dziurę w systemie sprawdzania typu. C zdecydowanie NIE jest silnie wpisane. –

+0

Jak powiedzieli inni, część dotycząca "silnego pisania" jest zupełnie błędna. – choeger

0

Sugeruję przeczytanie instrukcji na złączu bazy danych SQL. Złącze MySQL zapewnia interfejs API do uzyskiwania typów pól w wyniku wyniku.

Można utworzyć funkcję Factory, która wypełnia strukturę w oparciu o typ pola. Jak na ironię, ponieważ C nie ma typów bazowych, musisz użyć wskaźnika void * i przekształcić go na znany typ struktury. (Choć void * jest typem, który próbujesz pozbyć.)

+0

Zrobiłem coś podobnego, tworząc system wiążący, który ustawia zmienne, do których odwołują się wskaźniki "void *". Nie boję się 'void *', chcę tylko prosty framework do pracy z typami dynamicznymi w C. –

3

Chociaż wątpię, że oryginalny autorem jeszcze potrzeby się odpowiedź (mam nadzieję przynajmniej po 4 latach), chciałem dodać moje 2ct.

Po pierwsze, chciałbym powiedzieć, że to, o co prosisz, jest nazywane typem sumarycznym i zazwyczaj jest obsługiwane w językach funkcjonalnych (to znaczy raczej jest to funkcja projektowania języka, a nie kwestia biblioteki).

Po drugie, jest wysoce wątpliwe, że znajdziesz bibliotekę C dla tej sprawy z tego prostego powodu, że jakakolwiek taka biblioteka będzie obsługiwać ustalony zestaw wariantów, który prawdopodobnie nie pasuje do twoich potrzeb.

Howerver, ze względu na kompletność, możesz spróbować dać msgpack.

Powiązane problemy