1

私の例を考えてみてください。質問はコメントで概説されています。

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.
4

2 に答える 2

4

jeffのタグ名は正しいですか?

正しい。

この構造には「タグ」名がないと言うのは正しいですか?

丁度。

これは匿名構造体の別名ですよね? タグ名ではありません。

私の知る限り、これは typedef と呼ばれていますが、ここには構造タグはなく、typename のみです。

この構造体にはタグ名 jeff とエイリアス Jeffery があると言うのは正しいですか?

あなたがそう望むなら。

名前/エイリアスのない構造体が必要なのはなぜですか?

まあ、ただの楽しみのためですか?おそらく、それはどこかの一時変数であり、コードの他の場所ではまったく使用されていないため、構造体型を定義する必要はありませんでした。(とにかく、私はこのスタイルが好きではありません....)

于 2013-02-24T23:44:21.213 に答える
1

匿名構造に使用

匿名構造 (の配列) が役立つ場所の 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 名、あるいはその両方) が必要です。

于 2013-02-25T01:12:46.097 に答える