Как создать универсальную бесплатную C-функцию - PullRequest
0 голосов
/ 31 марта 2010

У меня есть некоторые C-структуры, связанные со структурой данных 'list'. Они выглядят так.

struct nmlist_element_s {
    void *data;
    struct nmlist_element_s *next;
};
typedef struct nmlist_element_s nmlist_element;

struct nmlist_s {
    void (*destructor)(void *data);
    int (*cmp)(const void *e1, const void *e2);
    unsigned int size;
    nmlist_element *head;
    nmlist_element *tail;
};
typedef struct nmlist_s nmlist;

Таким образом, я могу хранить разные типы данных в "nmlist_element-> data". «Конструктор» (в терминах ООП) имеет следующую подпись:

nmlist *nmlist_alloc(void (*destructor)(void *data));

Где "деструктор" - это конкретная функция, которая отменяет выделение "данных" (хранится в nmlist_element).

Если я хочу иметь список, содержащий целые числа в качестве данных, мой «деструктор» будет выглядеть так:

void int_destructor(void *data)
{
    free((int*)data);
}

Тем не менее я нахожу довольно «недружественным» для меня писать функции-деструкторы для каждого простого примитивного типа данных. Так есть ли способ написать что-то подобное? (для примитивов) :

void "x"_destructor(void *data, "x")
{
    free(("x" *)data);
}

PS: Я сам не фанат макросов, и из своего короткого опыта в отношении C я не использую их, если в этом нет необходимости.

Ответы [ 3 ]

12 голосов
/ 31 марта 2010

Функция C free () уже является общей. Просто используйте бесплатно (данные).

4 голосов
/ 31 марта 2010

Вам не нужно приводить его к int *, чтобы освободить его. Вы можете просто освободить пустоту * напрямую.

Если вы действительно хотите сделать это с макросами (или для дальнейшего использования, если у вас действительно есть функция, которая не является универсальной, в отличие от free ()), лучший способ - использовать X-макросы.

#define TYPES_TO_DESTRUCT \
 X(int) \
 X(char) \
 X(t_mytype)

#define X(type) \
void type##_destructor(void *data) { free((type *)data); }

TYPES_TO_DESTRUCT

#undef X
0 голосов
/ 31 марта 2010

Я думаю, что Коста понял это правильно. Но вы просите что-то вроде

#define DESTROY(x,data) (free((x##*)data))

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