1

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

したがって、ユニオンの順序を変更するだけでは役に立ちません。

4

2 に答える 2

1

.memberC++ には、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) };
于 2012-11-30T03:03:27.247 に答える
-1

これを行うだけです:

static const OptionDef options[] = {
   { "x", HAS_ARG, {opt_width }, "force displayed width", "width" },
    ...
于 2012-11-30T03:01:06.397 に答える