一部の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標準でも)?重要な点は、読みやすさのために初期化子で構造体フィールド名を指定できることです(実際の構造体には数十の整数フィールドとビットフィールドがあります)。初期化子でインデックスも表示できることもプラスになります。