いくつかの C コードを読んでいると、次の例のように、一部の構造体に変数名のない共用体名が含まれていることがわかりました。
typedef union Lock Lock;
union Lock{
uint32 key;
};
struct Test{
Lock;
uint32 name1;
};
Lock inside Test とはどういう意味ですか? PS。タイプ uint32 は、2 つの宣言の前に既に定義されています。
したがって、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には、これが何か役に立つというシナリオはないと思います。多分それは前方宣言の混乱した試みです。
コードをコンパイルできる場合は、古いコンパイラまたは暗黙的な intをまだサポートしているコンパイラを使用していると思います。これは、コンパイラがコードを次のように解釈することを意味します。
struct Test{
int Lock;
uint32 name1;
}
また、C で暗黙的な関数と型のない変数の宣言が許可されているのはなぜですか?も参照してください。
あなたが投稿したものは有効なCではありません。言語に関する限り、完全に異なるものであり、それだけですLock
。union Lock
ただしunion Lock
、構造体の内部でコンパイルするが何もしないと言うと、何も宣言しない余分な宣言になります。
構造体の先頭にunion Lock
orを追加すると何かが起こるという憶測があります。Lock
簡単なチェックで、false であることが証明されます。
printf("%zu\n", offsetof(struct Test, name1)); /* Will print 0. */