вторник, 2 января 2024 г.

Перегруженный макрос

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.

Комментариев нет:

Отправить комментарий