【问题标题】:initialize union members - using MS visual studio初始化工会成员 - 使用 MS Visual Studio
【发布时间】:2011-06-15 13:10:17
【问题描述】:

需要在编译时初始化一个联合成员。 阅读一些文章似乎除了定义第一个之外别无他法 加入工会。除非您使用 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 */

【问题讨论】:

  • 您正在尝试将常量字符串文字转换为非常量字符指针,不是吗?首先,我认为这不是一个好主意。

标签: c data-structures


【解决方案1】:

初始化联合时,联合中第一个命名的成员将被初始化(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}; 

【讨论】:

    【解决方案2】:

    Windows 不完全支持 C99,仅支持部分功能,因为它主要是 C++ 编译器。

    给你: http://connect.microsoft.com/VisualStudio/feedback/details/485416/support-c99

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-17
      • 2019-11-24
      • 1970-01-01
      • 2020-12-08
      • 2016-06-23
      相关资源
      最近更新 更多