我在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" },
因此,改变联盟的顺序无济于事。
答案 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" },
...