【问题标题】:Define an API that accepts multiple types each of which has its own range of possible values定义一个接受多种类型的 API,每种类型都有自己的可能值范围
【发布时间】:2020-02-20 12:11:06
【问题描述】:

我想定义一个接受(类型,值)对并对它们执行一些操作的 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% 清楚哪个值应该与哪个类型耦合。

【问题讨论】:

    标签: c api struct


    【解决方案1】:

    我认为根据您的有限示例,将union 用于value_t 可能是一个好主意。

    除此之外,您可以做的最好的事情是在 C 中直接在选择这些字段的枚举之后命名联合中的字段,以便这些数据结构的任何用户都清楚对应关系。

    对于您的示例,这可能意味着您应该使 value_t 看起来更像这样:

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

    因此,在选择类型选择器枚举标识符时,您可能会考虑如何将它们用作字段名称。

    然后您可能还想编写一个或一组宏来根据枚举值访问每个字段。

    可能还有其他方法可以以更 C 友好的方式设计您的 API 和数据结构,但您必须描述您的更大问题(可能在另一个问题中)以获得更多指导。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-08-10
      • 2021-06-11
      • 2017-11-17
      • 2016-09-23
      • 1970-01-01
      • 2016-09-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多