У меня есть некоторые 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 я не использую их, если в этом нет необходимости.