C(ANSI、C99など)では、構造体は独自の名前空間に存在します。リンクリストの構造体は、次のようになります。
struct my_buffer_type {
struct my_buffer_type * next;
struct my_buffer_type * prev;
void * data;
};
しかし、ほとんどのCプログラマーが次のような構造体を自動的にtypdefすることは非常に自然に思えます
typedef struct tag_buffer_type {
struct tag_buffer_type * next;
struct tag_buffer_type * prev;
void * data;
} my_buffer_type;
そして、通常の型のように構造体を参照しget_next_element(my_buffer_type * ptr)
ます。
今、私の質問は次のとおりです。これには特定の理由がありますか?
ウィキペディアによると、http://en.wikipedia.org/wiki/Typedef#Usage_concerns
一部の人々は、typedefの広範な使用に反対しています。ほとんどの引数は、typedefが変数の実際のデータ型を単純に隠すという考えに基づいています。たとえば、LinuxカーネルハッカーでありドキュメンタリーであるGreg Kroah-Hartmanは、関数プロトタイプ宣言以外の目的での使用を推奨していません。彼は、この慣行はコードを不必要に難読化するだけでなく、プログラマーが単純に大きなタイプの構造であると誤って誤用する可能性もあると主張します。[4]
typedefを使用すると、コードの保守が簡単になると主張する人もいます。K&Rは、typedefを使用する2つの理由があると述べています。まず、プログラムの移植性を高める手段を提供します。プログラムのソースファイル全体に現れるすべてのタイプを変更する代わりに、変更する必要があるtypedefステートメントは1つだけです。第二に、typedefは複雑な宣言を理解しやすくします。
場合によってはstruct
typedefされた構造体を使用しない別の名前空間を使用することで十分なメリットがないのか、他にもCプログラミング文化がいくつかあるので(Windows CプログラミングにはLinux Cプログラミングとは異なる伝統があります)私が知らない伝統。
それから私は歴史的な考察に興味があります(前任者、Cの最初のバージョン)。
typedef
ある変数の実際の型を非表示にします。テイクtime_t
例として:人々は周りの基礎となる整数型を使用して行けば、このような実装の変化は、コードの非常に多くが解除されます2038年に必要とされるものでした。people人々が理由を理解せずに構造を使用している場合、それは構造体ではなくプログラマーの失敗です。