Я пишу библиотеку контейнера в C
, и я хотел бы использовать с переменным числом аргументов в моей реализации, например, так:Получение C переменной длины с переменным размером, используя символ []
void stack_push(stack *self, T item);
T stack_pop(stack *self);
Очевидно, что C не имеет родовое типа, так что вместо этого я использую void *
указатели:
void stack_push(stack *self, void *item);
void *stack_pop(stack *self);
Однако, я имею в виду прохождение вход с использованием: с переменным числом аргументов
void stack_push(stack *self, ...);
Это может работать, потому что размер элемента определяется при инициализации контейнера.
Мой вопрос: Действительно ли он C
для доступа к членам Vararg с использованием другого типа с одинаковым размером?
void stack_push(stack *self, ...)
{
struct wrapper {
char item[self->item_size];
};
va_list ap;
struct wrapper item;
va_start(ap, self);
item = va_arg(ap, struct wrapper);
va_end(ap);
stack_grow(self, self->size+1);
memcpy(self->items+self->item_size*self->size++, &item, self->item_size);
}
Так как же вы намерены определить тип объектов? Непонятно, что вы просите, но подход выглядит подозрительно. – Olaf
Вы всегда можете использовать 'char'-массивы для переноса чего угодно. – alk
@akl Но это работает с 'varargs.h'? – YoYoYonnY