Как я могу статически инициализировать массив структур, содержащих объединение?

Я портирую некоторый старый код с C на C ++ в Visual Studio 2010, и я столкнулся с этим:

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" },
...

Который сейчас терпит неудачу с синтаксической ошибкой. Я видел ответ для Статическая инициализация анонимного объединения в C ++ но перегрузка конструкторов не будет работать, потому что я настраиваю массив. Есть ли другой способ сделать это (вместо того, чтобы просто переписать код, чтобы не использовать объединение)?

Обновить:
Я должен был быть более конкретным — массив содержит разные инициализаторы, использующие все части объединения:

static int is_full_screen;

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

Так что просто изменение порядка объединения не поможет.

1

Решение

C ++ не имеет .member синтаксис инициализации, который имеет C.

Вы можете использовать агрегатную инициализацию с объединениями, но только на первом члене.

Таким образом, перепишите его с тем, который вы хотите установить в качестве первого члена:

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" },

Вы также можете дать своей структуре конструктор — 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 вы можете сделать это с временными файлами, если структура имеет конструктор:

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

Другие решения

Просто сделай это:

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

По вопросам рекламы [email protected]