2

いくつかの C コードを読んでいると、次の例のように、一部の構造体に変数名のない共用体名が含まれていることがわかりました。

typedef union Lock Lock;

union Lock{
    uint32 key;
};

struct Test{
    Lock;
    uint32 name1;
};

Lock inside Test とはどういう意味ですか? PS。タイプ uint32 は、2 つの宣言の前に既に定義されています。

4

3 に答える 3

0

したがって、typedef を追加すると、gcc は警告を生成します。

main.c:8:9: warning: declaration does not declare anything [enabled by default]

また、単純sizeofにこれらが同じサイズであることを明らかにします。

struct Test{
    Lock;
    uint32 name1;
};

struct Test2{
    uint32 name1;
};

Cには、これが何か役に立つというシナリオはないと思います。多分それは前方宣言の混乱した試みです。

于 2013-04-11T17:04:41.807 に答える
0

コードをコンパイルできる場合は、古いコンパイラまたは暗黙的な intをまだサポートしているコンパイラを使用していると思います。これは、コンパイラがコードを次のように解釈することを意味します。

struct Test{
    int Lock;
    uint32 name1;
}

また、C で暗黙的な関数と型のない変数の宣言が許可されているのはなぜですか?も参照してください。

于 2013-04-11T07:50:45.213 に答える
0

あなたが投稿したものは有効なCではありません。言語に関する限り、完全に異なるものであり、それだけですLockunion Lock

ただしunion Lock、構造体の内部でコンパイルするが何もしないと言うと、何も宣言しない余分な宣言になります。


構造体の先頭にunion Lockorを追加すると何かが起こるという憶測があります。Lock簡単なチェックで、false であることが証明されます。

printf("%zu\n", offsetof(struct Test, name1)); /* Will print 0. */
于 2013-04-11T05:57:06.623 に答える