8


動的に型付けされた変数 (別名バリアント)を格納および操作するための適切なオープンソース C ライブラリはありますか? 私は主にアトミック値 (int8、int16、int32、uint、string、blob など) に関心がありますが、JSON スタイルの配列とオブジェクト、およびカスタム オブジェクトもいいでしょう。このようなライブラリが役立つ主なケースは、SQL データベースの操作です。

このようなライブラリの最も明白な機能は、サポートされているすべての値の単一の型です。たとえば、次のようになります。

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

その他の機能には、Variant オブジェクトと C 構造体との変換 (バインディング テーブルを使用)、文字列との間の値の変換、SQLite などの既存のデータベース ライブラリとの統合が含まれます。

注: これがC のジェネリック データ型のライブラリの複製であるとは思えません。、「キュー、ツリー、マップ、リスト」を指します。私が話しているのは、SQL データベースでの作業をインタープリター言語での作業とほぼ同じくらいスムーズにすることに重点を置いています。

4

4 に答える 4

5

GLib には、GValue の形式で一般的な値の型が実装されています: http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html

于 2010-06-14T22:57:34.777 に答える
0

SQL データベース コネクタのマニュアルを読むことをお勧めします。MySQL コネクタは、結果のフィールド タイプを取得するための API を提供します。

フィールド タイプに基づいて構造体を埋めるFactory関数を作成できます。皮肉なことに、C には Base 型がないため、void *ポインターを使用して、既知の構造体型に再キャストする必要があります。(void *あなたが取り除こうとしているタイプですが。)

于 2010-04-29T22:28:51.020 に答える
-4

C は非常に強力な型付き言語であり、バリアントはその哲学の一部ではありません。使用するデータ型を選択する必要があるため、共用体は解決策にはなりません。通常、色コードをintおよびに格納するために使用されchar[4]ます。

C-SQLite インターフェイスを見ると、次の関数が提供されています。

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

データ型は char* で表され、これらから型を取得する方法を理解するのは開発者の仕事です。どんな種類のバリアント型でもよかったと思いますが、それは C ではありません。C はバリアントを実装しておらず、そうするつもりもありません。

于 2010-04-29T06:35:01.853 に答える