https://ideone.com/Kp59hv
#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>
/*
"Variadic macros tricks"
https://w...content-available-to-author-only...t.co/2014/11/25/variadic-macros-tricks/
"Is it possible to iterate over arguments in variadic macros?"
https://stackoverflow.com/questions/1872220/is-it-possible-to-iterate-over-arguments-in-variadic-macros/
*/
#define _GET_OVERRIDE(ARG_1, ARG_2, ARG_3, ACTION, ...) ACTION
#define MALLOC(pMem) \
( \
{ \
pMem = malloc(sizeof(*pMem)); \
pMem ? 0 : 1; \
} \
)
#define MALLOC_1(ARG_1, ...) MALLOC(ARG_1)
#define MALLOC_2(ARG_1, ...) MALLOC(ARG_1) | MALLOC_1(__VA_ARGS__)
#define MALLOC_3(ARG_1, ...) MALLOC(ARG_1) | MALLOC_2(__VA_ARGS__)
/* with return value */
#define MULTI_MALLOC(...) _GET_OVERRIDE(__VA_ARGS__, MALLOC_3, MALLOC_2, MALLOC_1)(__VA_ARGS__)
#define FREE(pMem) \
{ \
free(pMem); \
pMem = NULL; \
}
#define FREE_1(ARG_1, ...) FREE(ARG_1)
#define FREE_2(ARG_1, ...) FREE(ARG_1) FREE_1(__VA_ARGS__)
#define FREE_3(ARG_1, ...) FREE(ARG_1) FREE_2(__VA_ARGS__)
/* without return value */
#define MULTI_FREE(...) _GET_OVERRIDE(__VA_ARGS__, FREE_3, FREE_2, FREE_1)(__VA_ARGS__)
int main(void)
{
uint16_t *pnShort = NULL;
uint32_t *pnInt = NULL;
uint64_t *pnLong = NULL;
printf("start: %p, %p, %p\n", pnShort, pnInt, pnLong);
if ( MULTI_MALLOC(pnShort, pnInt, pnLong) ) { return 1; }
printf("3 args: %p, %p, %p\n", pnShort, pnInt, pnLong);
MULTI_FREE(pnShort, pnInt, pnLong);
if ( MULTI_MALLOC(pnShort, pnInt) ) { return 1; }
printf("2 args: %p, %p, %p\n", pnShort, pnInt, pnLong);
MULTI_FREE(pnShort, pnInt);
if ( MULTI_MALLOC(pnShort) ) { return 1; }
printf("1 arg: %p, %p, %p\n", pnShort, pnInt, pnLong);
MULTI_FREE(pnShort);
printf("finish: %p, %p, %p\n", pnShort, pnInt, pnLong);
return 0;
Бен Клеменс "Язык С в XXI веке" гл.10 "Улучшенная структура" параграф "Векторизация функции" стр.218.
Комментариев нет:
Отправить комментарий