Gcc:访问和初始化struct中的联合和位域

时间:2015-05-06 08:36:04

标签: c gcc struct unions bit-fields

我有一个由union,变量和位域组成的结构:

typedef struct router_client {
    union {
        QHsm  *client;
        void (*handler)(QSignal sig, QParam par);
    };
    uint8_t level;
    struct {
        uint8_t presence:2;
        uint8_t is_hsm:1;
        uint8_t is_handler:1;
    };
} router_client_t;

初始化它的正确方法是什么?我曾经

router_client_t = {.client=(QHsm*)&qhsm_foo, level = l, \
.presence = p, .is_hsm = s, .is_handler = a}

但是当从Code Red MCU工具切换工具链到Cross GCC时,我开始

unknown field 'client' specified in initializer
unknown field 'presence' specified in initializer
...

联合的要点是我希望能够将值分配给客户端或处理程序,并让它们共享相同的指针。 我尝试了一些事情,我知道我可以更改结构但我只是想知道是否有C99方式初始化和访问它。

2 个答案:

答案 0 :(得分:3)

这可行。我认为诀窍是结构和联合的名称。

typedef union {
    int  *client;
    void (*handler)(int sig, int par);
}union_t;

typedef struct {
    uint8_t presence:2;
    uint8_t is_hsm:1;
    uint8_t is_handler:1;
}struct_t;

typedef struct router_client {
    union_t test;
    uint8_t level;
    struct_t test2
} router_client_t;

void main()
{
    int pippo;
    router_client_t pippo2= {.test.client=(int*)&pippo, .level = 10, .test2.presence = 2, .test2.is_hsm = 1, .test2.is_handler = 1};
}

或者你写的:

#include <stdint.h>

typedef struct router_client {
    union{
        int  *client;
        void (*handler)(int sig, int par);
    }union_t;
    uint8_t level;
    struct {
        uint8_t presence:2;
        uint8_t is_hsm:1;
        uint8_t is_handler:1;
    }struct_t;
} router_client_t;

void main()
{
    int pippo;
    router_client_t pippo2= {.union_t.client=(int*)&pippo, .level = 10, .struct_t.presence = 2, .struct_t.is_hsm = 1, .struct_t.is_handler = 1};
}

答案 1 :(得分:2)

我看到一个未命名的结构和一个未命名的联合。

很可能交叉gcc编译器不处理具有默认标准的匿名结构和联合。

建议在编译中添加适当的参数,例如

'-std=c11'