Определите API, который принимает несколько типов, каждый из которых имеет свой диапазон возможных значений. - PullRequest
0 голосов
/ 19 февраля 2020

Я хочу определить API, который принимает пару (тип, значение) и выполняет с ними некоторые операции.

typedef enum {
    TTL_ENTRY = 1,
    ACCESS_ENTRY = 2
}type_t;

typedef struct {
    type_t type;        
    uint32 value;    
}type_val_t;

int entries_add(size_t count, type_val_t *type_val);

Каждый тип имеет свой диапазон возможных значений.

Значением TTL_ENTRY может быть uint32 с любым значением.

Значение ACCESS_ENTRY должно принимать только значения из перечисления:

typedef enum {
    STATE_NONE = 0,        
    STATE_DROP,            
    STATE_PATH             
    /* ... */
}state_t;  

Есть ли способ сделать этот API более понятным, какое значение должно быть сопряжено с каким типом? Или как-то связать тип значения для каждого типа из type_t?

Я думал, что преобразование типа значения из uint32 в объединение возможных значений, например так:

typedef union {
    uint32 ttl_bitmap;
    state_t state;
}value_t;


typedef struct {
    type_t type;        
    value_t value;    
}type_val_t;

Но даже при использовании этого Для типа не ясно на 100%, какое значение должно быть связано с каким типом.

1 Ответ

1 голос
/ 20 февраля 2020

Я думаю, исходя из вашего ограниченного примера, что использование union для value_t, вероятно, является хорошей идеей.

Самое лучшее, что вы можете сделать, в C - это назвать поля в объединении непосредственно после перечислений, которые выбирают эти поля, так что соответствие любому пользователю этих структур данных понятно.

Для вашего примера это может означать, что вы должны сделать value_t похожим на это:

typedef union {
    uint32 ttl_entry;
    state_t access_entry;
} value_t;

Поэтому, выбирая идентификаторы перечисления селектора типа, вы можете подумать о том, как они также могут использоваться в качестве имен полей.

Затем вы также можете написать макрос или набор макросов для доступа к каждому из них. поле, основанное на значении enum.

Могут быть и другие способы проектирования вашего API и структур данных более дружественным к C способом, но вам придется описать более крупную проблему (возможно, в другом вопросе) чтобы получить больше указаний.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...