匿名構造に使用
匿名構造 (の配列) が役立つ場所の 1 つは、データが 1 つの関数の外部で必要とされないコード内です。
const char *info_lookup(int value)
{
static const struct { int number; char *name; } list[] =
{
{ 1, "twenty-seven" },
{ 13, "unfortunately" },
{ 27, "won" },
...
};
enum { NUM_LIST_ITEMS = sizeof(list) / sizeof(list[0]) };
for (i = 0; i < NUM_LIST_ITEMS; i++)
{
if (value <= list[i].number)
return(list[i].name);
}
return(0);
}
また、構造体がテスト情報を取得するテストを実行するために使用することもあります。
static const struct
{
const char *ver1;
const char *ver2;
int result;
} test[] =
{
{ "7.0.4.27", "7.0.4.17", +1 },
{ "7.0.4.23", "7.0.4.17", +1 },
{ "7.0.4.23", "7.0.4.27", -1 },
{ "7.0.4.23", "7.0.5.07", -1 },
...20+ tests omitted...
};
enum { NUM_TESTS = DIM(test) };
static const char *result(int i)
{
if (i < 0)
return("<");
else if (i > 0)
return(">");
else
return("=");
}
int main(void)
{
size_t j;
int fail = 0;
for (j = 0; j < NUM_TESTS; j++)
{
int r1 = version_compare(test[j].ver1, test[j].ver2);
int r2 = version_compare(test[j].ver2, test[j].ver1);
const char *pass_fail = "PASS";
char extra[32] = "";
if (r1 != test[j].result)
{
pass_fail = "FAIL";
fail++;
snprintf(extra, sizeof(extra), " Expected %s", result(test[j].result));
}
assert(r1 == -r2);
printf("%s: %-10s %s %s%s\n",
pass_fail, test[j].ver1, result(r1), test[j].ver2, extra);
}
if (fail == 0)
{
printf("== PASS == %d tests passed\n", NUM_TESTS);
return(0);
}
else
{
printf("!! FAIL !! %d out of %d tests failed\n", fail, NUM_TESTS);
return(1);
}
}
ファイルの外側に構造体について知る必要がない場合、および型の変数が 1 つしかない場合にのみ適切です (または、型のすべての変数を 1 つの宣言で宣言できますが、通常は宣言ごとに 1 つの宣言子しかありません)。 、そのタイプの 1 つの変数になります)。
型を複数回参照する必要がある場合は、名前 (構造タグまたは typedef 名、あるいはその両方) が必要です。