问题描述
|
需要在编译时初始化一个union成员。
阅读一些文章似乎只能定义第一个
参加工会。除非使用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 */
解决方法
初始化联合时,联合的第一个命名成员是将要初始化的成员(ISO 9899:1999 6.7.8§17)。
也就是说,除非您像在最后一行尝试那样使用C99指定的初始化程序,否则所选成员就是将要初始化的成员。但是VS显然不支持C99。
通过将联合声明更改为以下方法来解决该问题:
typedef union {
char *atxt;
int a;
} MY_UNION_t;
/* make sure that the string \"bla\" isn\'t allocated in read-only memory,since you intend to point at it with a non-const pointer */
char bla[] = \"bla\";
GEN_DATA_t obj2 = {0,bla};
, Windows不完全支持C99,仅完全支持某些功能,因为Windows主要是C ++编译器。
干得好:
http://connect.microsoft.com/VisualStudio/feedback/details/485416/support-c99