考虑我的例子:问题在评论中概述。
struct jeff { //jeff is the tag name correct?
int age;
int weight;
};
typedef struct { // Is it correct to say that this structure has no "tag" name?
int age;
int weight;
}jeff; // This is an alias for an anonymous structure correct? Not its tag name.
typedef struct jeff { // Is it correct to say that this struct has a tag name jeff
int age; // and an alias Jeffery?
int weight;
} Jeffery;
这些问题实际上只是关于C语言的正确语义。
最后一个问题:
struct {
int age;
int weight;
}jeff; // Why would one want a struct with no name/alias. I don't see the benefit.
杰夫,标签名称正确吗?
正确。
说这个结构没有"标签"名称是正确的吗?
没错。
这是匿名结构的别名,对吗?不是它的标签名称。
AFAIK它被称为typedef,但这里没有结构标记,只有typename。
说这个结构有一个标记名jeff和一个别名Jeffery是正确的吗?
如果你愿意的话。
为什么要一个没有名称/别名的结构?
也许只是为了好玩?也许它在某个地方是一个临时变量,在代码中的其他地方根本没有使用它,所以为它定义一个结构类型是多余的
用于匿名结构
匿名结构(数组)有用的一个地方是在代码中,在一个函数之外不需要数据。
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%sn",
pass_fail, test[j].ver1, result(r1), test[j].ver2, extra);
}
if (fail == 0)
{
printf("== PASS == %d tests passedn", NUM_TESTS);
return(0);
}
else
{
printf("!! FAIL !! %d out of %d tests failedn", fail, NUM_TESTS);
return(1);
}
}
只有当文件之外的任何东西都不需要了解结构,并且只有一个类型的变量时(或者你可以在一个声明中声明该类型的所有变量,但我通常每个声明只有一个声明符,所以这相当于该类型的一个变量),才适用。
如果您需要多次引用该类型,那么它需要一个名称——structure标记或typedef名称,或者两者兼而有之。