Я портирую некоторый старый код с 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" },
Так что просто изменение порядка объединения не поможет.
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) };
Просто сделай это:
static const OptionDef options[] = {
{ "x", HAS_ARG, {opt_width }, "force displayed width", "width" },
...