如何静态初始化包含联合的结构数组?

时间:2012-11-30 02:54:49

标签: c++ arrays visual-studio-2010 initialization unions

我在Visual Studio 2010中将一些旧代码从C转移到C ++,我遇到了这个:

typedef struct OptionDef {
    const char *name;
    int flags;
    union {
        void *dst_ptr;
        int (*func_arg)(void *, const char *, const char *);
        size_t off;
    } u;
    const char *help;
    const char *argname;
} OptionDef;

static const OptionDef options[] = {
    { "x", HAS_ARG, { .func_arg = opt_width }, "force displayed width", "width" },
    ...

现在因语法错误而失败。我已经看到了Statically initialize anonymous union in C++的响应,但是重载构造函数将无法工作,因为我正在设置一个数组。有没有其他方法可以做到这一点(而不仅仅是重写代码而不使用联合)?

更新: 我应该更具体 - 数组包含使用联合的所有部分的不同初始化程序:

static int is_full_screen;

    { "fs", OPT_BOOL, { &is_full_screen }, "force full screen" },

因此,改变联盟的顺序无济于事。

2 个答案:

答案 0 :(得分:1)

C ++没有C语言的.member初始化语法。

您可以对联合使用聚合初始化,但仅对第一个成员使用。

因此,用您想要设置为第一个成员的那个重写它:

union {
    int (*func_arg)(void *, const char *, const char *);
    void *dst_ptr;
    size_t off;
} u;

static const OptionDef options[] = {
    { "x", HAS_ARG, { opt_width }, "force displayed width", "width" },

你也可以给你的struct一个构造函数--C ++ 11应该允许你使用大括号初始化器。

示例:

struct foo {
    int flags;
    struct uwrap {
      uwrap(int (*func_arg)(void *, const char *, const char *))
      : func_arg(func_arg) {}
      uwrap(int off)
      : off(off) {}
      union {
          void *dst_ptr;
          int (*func_arg)(void *, const char *, const char *);
          int off;
      };
    } u;
};

int func(void *, const char *, const char *) {}

int main() {
    foo f[] = { { 1, {func}}, { 2, {0}} };
}

在C ++ 03中,如果struct有一个构造函数,你可以使用临时代码:

foo f[] = { foo(1, func), foo(3, 0) };

答案 1 :(得分:-1)

这样做:

static const OptionDef options[] = {
   { "x", HAS_ARG, {opt_width }, "force displayed width", "width" },
    ...