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

Gcc: Accessing and initializing unions and bitfields within struct

我有一个由联合、变量和位域组成的结构:

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 方法来初始化和访问它。

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

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

建议在编译时添加适当的参数,比如

'-std=c11'

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

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};
}