Błąd. Da się tak zrobić, jednakże jest to fatalne rozwiązanie.
[good]
#include <stdio.h>
#include <stdlib.h>
#include <inttypes.h>
typedef struct _vector{
size_t element_size;
size_t size;
void **elements;
} vector;
vector *new_vector(size_t element_size, size_t size){
vector *self = malloc(sizeof(vector));
self->element_size = element_size;
self->size = size;
self->elements = malloc(element_size*size);
return self;
}
void free_vector(vector *self){
free(self);
}
void *vector_at(vector *self, size_t position){
return position < self->size
? (char*)self->elements+position*self->element_size
: NULL;
}
int main(void) {
vector *v = new_vector(sizeof(int), 10);
int *e5th = vector_at(v, 5);
*e5th = 666;
printf("%d %d", v->size, *e5th);
free_vector(v);
return 0;
}
[bad]
#include <stdio.h>
#include <stdlib.h>
#include <inttypes.h>
#define DEFINE_VECTOR(VECTOR_TYPE) \
typedef struct _vector##VECTOR_TYPE{ \
size_t element_size; \
size_t size; \
void **elements; \
} vector##VECTOR_TYPE; \
\
vector##VECTOR_TYPE *new_vector##VECTOR_TYPE(size_t size){ \
vector##VECTOR_TYPE *self = malloc(sizeof(vector##VECTOR_TYPE)); \
self->element_size = sizeof(VECTOR_TYPE); \
self->size = size; \
self->elements = malloc(self->element_size*size); \
return self; \
} \
\
void free_vector##VECTOR_TYPE(vector##VECTOR_TYPE *self){ \
free(self); \
} \
\
VECTOR_TYPE *vector##VECTOR_TYPE##_at(vector##VECTOR_TYPE *self, size_t position){\
void *result = position < self->size \
? (char*)self->elements+position*self->element_size \
: NULL; \
return (VECTOR_TYPE*)result; \
} \
DEFINE_VECTOR(float)
DEFINE_VECTOR(int)
DEFINE_VECTOR(char)
int main(void) {
vectorfloat *v = new_vectorfloat(10);
float *e5th = vectorfloat_at(v, 5);
*e5th = 6.666;
printf("%d %g", v->size, *e5th);
free_vectorfloat(v);
return 0;
}