1

一部のCコードをC++に移植していますが、サブオブジェクトの初期化を処理する特定の問題を解決できません。

次のコードは、私が言っていることの例です。

#include <stdio.h>

#define MY_INDEX        1
#define MY_OTHER_INDEX  3

/* Structure declaration */
struct my_struct
{
    int a;
    int b;
    int c;
};

/* Array declaration and initialization */
struct my_struct my_array[] =
    {
        [0]                 = (struct my_struct) {0, },
        [MY_INDEX]          = ((struct my_struct) {
                                .a = 10,
                                .b = 20,
                                .c = 30
                                }),
        [MY_OTHER_INDEX]    = ((struct my_struct) {
                                .a = 42,
                                .b = 42,
                                .c = 42
                                })
    };

/** Test code */
int
main(void)
{
        unsigned int i;

        for (i = 0; i < sizeof(my_array)/sizeof(struct my_struct); i++)
                printf("Index %u: a=%d, b=%d, c=%d\n",
                        i, my_array[i].a, my_array[i].b, my_array[i].c);

        return 0;
}

警告やエラーなしでコンパイルできますが、フラグをgcc -ansi -Wall追加すると、ISOC90が初期化するサブオブジェクトの指定を禁止していることを示す警告がスローされます。-pedantic

の初期化は、次のmy_arrayように動作します。

  • インデックス0はa、b、c=0になります
  • インデックス1(MY_INDEX)はa = 10、b = 20、c=30になります
  • インデックス2もa、b、c=0になります
  • インデックス3(MY_OTHER_INDEX)はa、b、c=42になります

私はこの形式の初期化が本当に好きです。簡潔で読みやすいと思います。

この構文をC++で使用すると、GCCは、が原因でラムダ関数を宣言していると見なし[]、インデックスがなくても、GCCは「struct」の前にプライマリ式が必要であると通知します。

C ++で同等のものは何ですか(C ++ 11標準でも)?重要な点は、読みやすさのために初期化子で構造体フィールド名を指定できることです(実際の構造体には数十の整数フィールドとビットフィールドがあります)。初期化子でインデックスも表示できることもプラスになります。

4

1 に答える 1

4

C++ には、C がサポートする特殊な集計初期化子構文がすべて含まれているわけではありません。代わりに、次のように言います。

my_struct my_array[] = { { },
                         { 10, 20, 30 },
                         { 42, 42, 42 },
                       };

配列に「ギャップ」を含めることはできません(Cでもそうではないと思います)。

于 2012-08-21T14:47:50.127 に答える