我有一个由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方式初始化和访问它。
答案 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'