Type定义枚举类型作为结构

时间:2018-02-19 13:15:11

标签: c struct enums embedded typedef

嵌入式c在这里。 我们的一位合作伙伴向我们发送了他们正在使用的库函数的API原型。有一个类似的枚举:

typedef enum{
     val1 = 0, 
     val2 = 1, 
    [..]
} status;

然后将枚举类型定义为结构:

typedef struct status status_t;

这种typedef的含义是什么? 它有一些实际意义吗? 我是否必须像常规结构一样处理它? 我认为,这种方法我可以将枚举器转换为结构,我可以访问结构的成员,但我不确定。 任何提示都将非常感激。 B.R。 升。

在arm-gcc上,GNU c99

2 个答案:

答案 0 :(得分:5)

这是两种不同的类型。

结构名称在它们自己的命名空间中。因此struct statusstatus不同。前者是结构的名称,而后者是typedef,指的是未命名的enum

分配给枚举的typedef名称与赋予结构的标记名称相同这一事实并不意味着它们以任何方式与编译器相关联。

答案 1 :(得分:3)

考虑以下有效代码:

typedef enum
{
     STATUS1 = 0, 
     STATUS2 = 1
} status ;


// struct tag
//         |
//         V
struct status
{
    status status ;
    //  ^    ^
    //  |    |_______
    //  |           |
    // type_name  member_name
} ;

typedef struct status status_t ;
//                       ^
//                       |
//                      Type alias
int main()
{

    // The following is valid    
    status_t status_structure ;
    status_structure.status = STATUS1 ;

    // So is this    
    struct status status ;
    status.status = STATUS1 ;


    return 0;
}

类型名称status与成员名称status和结构标记status不同。在给定的代码中,或者可能不包括但必要的代码,是结构的单独定义 ,称为status

在C中,struct标签本身不是类型标识符,因此没有歧义struct status与枚举类型别名status的类型不同。它不一定是个好主意,但它并非无效。如果使用C ++编译,它当然会失败,因为struct statusstatus将是一个类型名称,因此与枚举别名status冲突。