Родовой связанный список библиотека в C


Я довольно новыми для C, поэтому я решил реализовать SRFI-1 (связные списки в библиотеке), чтобы помочь мне узнать.

Что у меня до сих пор работает, но обрабатывает только целые числа.

typedef struct pair {
  int car;
  struct pair *cdr;
} pair;

Из того что я читал я могу использовать пустоту * для автомобиля:

typedef struct pair {
  void *car;
  struct pair *cdr;
} pair;

Это работает, но я получаю много этих...

llist.c:262:3: warning: format ‘%d’ expects type ‘int’, but argument 2 has type ‘void *’
llist.c:27:7: note: expected ‘void *’ but argument is of type ‘int’

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

Единственным способом я могу думать, это с помощью какой-то универсальный тип объекта:

typedef struct object {
  union {
    int fixnum;
    double flonum;
  }
}

typedef struct pair {
  object *car;
  struct pair *cdr;
} pair;

Или что-то подобное.

Есть ли лучшая практика для обобщенных функций/типов данных?

Полный источник здесь.



3515
5
c
задан 23 мая 2011 в 01:05 Источник Поделиться
Комментарии
1 ответ

Void*, который является стандартным для реализации таких дженериков в с. беда с Союзом заключается в том, что конечный пользователь не может поставить свои собственные типы/структуры в нем. С Void * указатель на пользовательскую структуру можно использовать. Однако, будьте осторожны об утечках памяти!

Предупреждения вы получаете, потому что вы не постоянно пользовались пустоту*.

llist.c:262:3: warning: format ‘%d’ expects type ‘int’, but argument 2 has type ‘void *’

Это означает, что вы е передоза данные, как если бы он был инт. Но вы не знаете, что это так вы не можете сделать это. Либо не обеспечивают параметры печати или предоставляют способ управления как объект отпечатков.

llist.c:27:7: note: expected ‘void *’ but argument is of type ‘int’

У вас есть Void * и вы передаете его в функцию, которая принимает тип int. Все внутри вашей библиотеке должны быть, используя Void * не инт. Следует только фактический код, используя вашу библиотеку разраб пустоту * в int или что там они используют.

3
ответ дан 23 мая 2011 в 05:05 Источник Поделиться