需要在编译时初始化联合成员。阅读一些文章,似乎除了定义联合中的第一个条目之外别无他法。除非您使用 C99,否则您可以专门定义每个联合成员。
问题是我使用 Visual studio 2010 Prof。它似乎不支持 C99 或者我如何启用 ist?或者还有其他方法来初始化联合成员吗?
谢谢
typedef union {
int a;
char *atxt;
} MY_UNION_t;
typedef struct {
int foo;
MY_UNION_t un;
}GEN_DATA_t;
/* need to do following: */
GEN_DATA_t obj1 = {0,1}; /* Okay works */
GEN_DATA_t obj2 = {0,"bla"}; /* Does not work */
/* ISO C99 allows: */
GEN_DATA_t obj3 = {0,.atext="bla"}; /* However MS VS seem not to support this */
Run Code Online (Sandbox Code Playgroud)
初始化联合时,联合的第一个命名成员就是将被初始化的成员 (ISO 9899:1999 6.7.8 \xc2\xa717)。
\n\n也就是说,除非您像在最后一行中尝试那样使用 C99 指定的初始化程序,否则所选成员就是将被初始化的成员。但VS显然不支持C99。
\n\n通过将联合声明更改为以下方式解决该问题:
\n\ntypedef union {\nchar *atxt;\nint a;\n} MY_UNION_t;\n\n/* make sure that the string "bla" isn\'t allocated in read-only memory, \n since you intend to point at it with a non-const pointer */\nchar bla[] = "bla"; \n\nGEN_DATA_t obj2 = {0, bla}; \nRun Code Online (Sandbox Code Playgroud)\n