Makra, czy taka magia jest możliwa?

0

Witam.

Zastanawiam się czy da się zrobić coś w takim stylu:

  • vector.h (alias vector)
#define VECTOR(name) VECTOR_ ## name ## _H
#ifndef VECTOR(TYPE)
#define VECTOR(TYPE)


#error

#endif
  • test.c
#include <stdio.h>

#define TYPE int
#include <vector>


int main(int argc, char **argv)
{

  return 0;
}

Taki dostaje komunikat, gdy próbuję to wszystko skompilować:

In file included from stud.c:4:0:
./vector:2:15: warning: extra tokens at end of #ifndef directive [enabled by default]
 #ifndef VECTOR(TYPE)

Dziękuje z góry za wszystkie odpowiedzi,
Pozdrawiam

0

Napisz lepiej co chcesz osiagnac.

0

Spróbuję jak najlepiej wytłumaczyć. Chodzi mi o to, aby wczytać plik nagłówkowy kilka razy, a jego zawartość była by zależna od poprzednio utworzonej definicji. W pliku nagłówkowym będą definiowanie funkcje, których nazwy są zależne od definicji TYPE (w przypadku poprzedniego kodu).

1

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;
}
0

Dziękuje serdecznie.
Uświadomiłem sobie, że mój sposób nie jest zbyt dobry, i rozwiązanie użytkownika @spartanPAGE jest o lepsze.

1 użytkowników online, w tym zalogowanych: 0, gości: 1