Захотелось сабжа. Недолго думая наваял несколько макросов. 
Я их даже не тестировал и не компилировал примеры с ними, а V_SET даже и не 
написан полностью (потому и приводить не буду - и так многабукаф), но, думаю, мысль основная ясна. 
Подразумевается возможность ловли ошибок и просто событий в передаваемый кэллбак. 
Остальное ясно из кода. Вопросов несколько:
1. Имеет ли право на существование такой код, или лучше переписать
всё на функциях (тип элемениов тупо void * и всё)?
2. Может комбинированный вариант (макросы типо DECLARE_FUNC_SET
(name,type), которые определяют функцию с нужными типами, но есть и 
выигрыш в размере результирующего кода (за счёт использования функций)).
3. Ну и естественно - ваш вариант :).
================================
enum vec_event_e {
    vec_event_SET               = 0x01,
    vec_event_GET               = 0x02,
    vec_event_INIT              = 0x04,
    vec_event_DESTROY           = 0x08,
    vec_event_OUT_OF_RANGE      = 0x10,
    vec_event_NOT_ENOUGH_MEMORY = 0x20,
    vec_event_ALL               = 0x3f,
};
enum grow_type_e { grow_type_ADD, grow_type_MUX };
#define DECLARE_VECTOR(name,type,null_elem,init_count) \
    struct name##_s {                   \
        type mas[(init_count)]={0};     \
        int el_st_count = (init_count); \
        type * values = NULL;           \
        type el_null = (null_elem);     \
        int el_last_idx = 0;            \
        int el_alloc = (init_count);    \
        int grow = 0;                   \
        enum grow_type_e gr_type = 0;   \
        vec_event_e e_mask = 0;         \
        void (* log_f)(char * nm,       \
                vec_event_e ev, char * file,    \
                char * func, int line) = NULL;  \
    } name;
#define INIT_VECTOR(name, grow_type, grow_val, ev_mask, logf)   \
    do {                            \
        name.values = name.mas;     \
        name.grow = (grow_val);     \
        name.gr_type = (grow_type); \
        name.e_mask = (ev_mask);    \
        name.log_f = (logf);        \
        if(name.log_f && (name.e_mask & vec_event_INIT)){\
            name.log_f(#name, vec_event_INIT,       \
                    __FILE__, __func__, __LINE__);  \
        }\
    }while
#define DESTROY_VECTOR(name)        \
    do {                            \
        if(name.values != name.mas){\
            free(name.values);      \
            name.values = NULL;     \
        }                           \
        name.el_last_idx = 0;       \
        name.el_alloc = sizeof(name.mas)/sizeof(name.mas[0]);\
        name.grow = 0;              \
        if(name.log_f && (name.e_mask & vec_event_DESTROY)){\
            name.log_f(#name, vec_event_DESTROY,            \
                    __FILE__, __func__, __LINE__);          \
        }                                                   \
        name.e_mask = 0;            \
        name.log_f = NULL;          \
    }while
#define V_GET(name, pos)                        \
    ((name.el_last_idx>=(pos)) && ((pos)>0)) ?  \
            do{                                             \
                if(name.log_f && (name.e_mask & vec_event_GET)){\
                    name.log_f(#name, vec_event_GET,        \
                            __FILE__, __func__, __LINE__);  \
                }                                           \
            }while, name.values[pos] :                      \
            do{                                             \
                if(name.log_f && (name.e_mask &             \
                        (vec_event_GET | vec_event_OUT_OF_RANGE))){\
                    name.log_f(#name, vec_event_GET | vec_event_OUT_OF_RANGE,\
                            __FILE__, __func__, __LINE__);  \
                }                                           \
            }while, name.el_null;

    
      Ответ на:
      
          комментарий
        от klalafuda 
  
    
      Ответ на:
      
          комментарий
        от lv 
  
    
      Ответ на:
      
          комментарий
        от klalafuda 
  
    
      Ответ на:
      
          комментарий
        от lv 
  

    
      Ответ на:
      
          комментарий
        от wfrr 
  
    
      Ответ на:
      
          комментарий
        от temp 
  
    
      Ответ на:
      
          комментарий
        от lv 
  
    
      Ответ на:
      
          комментарий
        от wfrr 
  
    
      Ответ на:
      
          комментарий
        от lv 
  

    
      Ответ на:
      
          комментарий
        от lv 
  
    
      Ответ на:
      
          комментарий
        от anonymous 
  

    
        Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.
      
Похожие темы
- Форум Трассировка вызова функций - Call Нunter (2023)
 - Форум Помогите с прогой на Си под СанОС (2001)
 - Форум getaddrinfo выдает нулевые адреса 0.0.0.0 (2022)
 - Форум Зачем нужны GTK_DIALOG(obj), GTK_WINDOW(obj) и т.п.? (2015)
 - Форум Соединится с сервером по сокету? (2020)
 
- Форум Быдлокод не быдлокод? (2014)
 - Форум K&R Задача 1.16 (2015)
 - Форум [C] Хидеры и Undefined reference. (2012)
 - Форум Призываются мастера препроцессора С (2014)
 - Форум Консольный обмен сообщениями (2017)