Я пытаюсь смоделировать поведение «шаблона» в C как часть упражнения по рефакторингу кода с cpp на C. Я разработал MACRO-подход, определив как struct вот так:
#define FIFO(TYPE, depth, NAME) \
typedef struct fifo_##TYPE##NAME \
{ \
TYPE array[depth]; \
uint8 st_idx; \
uint8 end_idx; \
uint32 cnt; \
}fifo_##TYPE##NAME; \
void fifo_##TYPE##NAME_init(fifo_##TYPE##NAME *f); \
int fifo_##TYPE##NAME_push(fifo_##TYPE##NAME *f, TYPE *elem); \
TYPE* fifo_##TYPE##NAME_pop(fifo_##TYPE##NAME *f); \
TYPE* fifo_##TYPE##NAME_peek(fifo_##TYPE##NAME *f); \
Затем я определил функции MACRO для прототипов, показанных выше. Это фактически увеличило размер моего кода по сравнению с шаблонным подходом, поскольку каждая из функций определялась для каждого ТИПА.
Теперь я пытаюсь использовать void* подход вместо MACRO. Я все еще использую определение структуры MACRO, как указано выше, но я не определяю функции MACRO. Я использую обычные встроенные функции в файле .h, но я застрял на том, как получить доступ к членам общей структуры TYPE через void* ptr. К какому типу я могу привести его? Если имя структуры изменяется в соответствии с TYPE, у меня нет определенного типа структуры для его приведения. Кроме того, макросы не будут работать в функциях, не являющихся макросами.
Извините за многословие! Спасибо.
#define
, я бы предпочел решить это с помощью генерации кода. Сгенерированный код легче отлаживать. - person wimh   schedule 13.03.2015NAME
? Если вы собираетесь использовать шаблоны C++, то вы должны знать, чтоFIFO<int, 10>
будет похоже наFIFO(int, 10)
. Какая польза отNAME
при определении такого типа (отличается лиFIFO_intX
с глубиной 10 по структуре отFIFO_intY
с глубиной 10?) Имеет ли Общие контейнеры с макросами помогают вообще? - person   schedule 14.03.2015array
? Если это так, то мне вообще не имеет смысла иметь параметрdepth
, когда вы можете просто выделить, используя размер по умолчанию, аналогичный конструктору по умолчанию в C++, и вы можете предоставить другую функцию для выделения определенной суммы дляdepth
как с конструктором, принимающим аргументdepth
. Я извиняюсь за все вопросы, но чем больше я смотрю на это, тем больше кажется, что он пытается достичь большего, чем просто шаблоны C++. Думаю, я не понимаю причины особого дизайна макроса. - person   schedule 14.03.2015inline void init(void* f) { f->count=0; //f needs to be type cast into the struct type f->end_idx =0; f->st_idx =0; }
Функция вызова выглядит так:init(&fifo1);
- person thegeeklife   schedule 14.03.2015int16_t *p = (void*)0; p += 2;
иunsigned char *p = (void *)0; p += 2 * sizeof(int16_t);
оба приводят к тому, чтоp==(void*)8
является истинным. Я просто использую его много, и все. - person   schedule 14.03.2015