Библиотека типов данных для C - PullRequest
7 голосов
/ 29 апреля 2010

Есть ли приличная библиотека C с открытым исходным кодом для хранения и манипулирования
переменные с динамической типизацией (варианты с расширением a.k.a.)? В первую очередь меня интересуют атомарные значения (int8, int16, int32, uint, строки, BLOB-объекты и т. Д.), В то время как массивы и объекты в стиле JSON, а также пользовательские объекты также подойдут. Основной случай, когда такая библиотека была бы полезна, - это работа с базами данных SQL.

Наиболее очевидной особенностью такой библиотеки является единый тип для всех поддерживаемых значений, например ::

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

Другие функции могут включать преобразование объектов Variant в / из структур C (с использованием таблицы привязок), преобразование значений в / из строк и интеграцию с существующей библиотекой базы данных, такой как SQLite.

Примечание: я не верю, что этот вопрос является дубликатом Любой библиотеки для универсальных типов данных в C? , которая ссылается на "очереди, деревья, карты, списки". То, о чем я говорю, больше сосредоточено на том, чтобы сделать работу с базами данных SQL примерно такой же гладкой, как работа с ними на интерпретируемых языках.

Ответы [ 4 ]

5 голосов
/ 15 июня 2010

GLib имеет реализацию типов общих значений в виде GValue: http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html

3 голосов
/ 19 декабря 2014

Хотя я сомневаюсь, что первоначальному автору все еще нужен ответ (надеюсь, по крайней мере, через 4 года), я хотел добавить свой 2ct.

Сначала позвольте мне заявить, чтоваш запрос называется типом суммы и обычно поддерживается в функциональных языках (то есть это скорее функция проектирования языка, а не проблема библиотеки).

Во-вторых, весьма сомнительно, что вы найдетеC-библиотека для этого случая по той простой причине, что любая такая библиотека будет поддерживать фиксированный набор вариантов, который, вероятно, не соответствует вашим потребностям.

Howerver, ради полноты вы, возможно, захотите дать msgpack попробовать.

0 голосов
/ 30 апреля 2010

Предлагаю прочитать руководство по соединителю базы данных SQL. Коннектор MySQL предоставляет API для получения типов полей в результате .

Вы можете создать функцию Factory , которая заполняет структуру на основе типа поля. По иронии судьбы, поскольку в C нет базовых типов, вам придется использовать указатель void * и выполнить преобразование в известный тип структуры. (Даже если void * - это тип, от которого вы пытаетесь избавиться.)

0 голосов
/ 29 апреля 2010

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

Типы данных представлены символом *, и задача разработчика - выяснить, как получить типы из них. Я думаю, что любой тип варианта был бы лучше, но это не C. C не реализует варианты и не предназначен для.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...