web-dev-qa-db-ja.com

typedefとそれに関連するstructタグに異なる識別子が必要なのはなぜですか?

これをすぐに休ませるように見えるOccamのRazorを(困難にして)無視すると、これにはどのような利点がありますか。

typedef struct s_header {
    struct s_header *next;
    //...
} Header;

これ以上:

typedef struct header {
    struct header *next;
    //...
} header;

この質問は このコードレビューの回答 へのコメントで私が持っていた議論に基づいています。私の指摘は、エラーも指摘することで薄められました(どこにでも同じ名前を使用することで回避するのが簡単になると思います)。

7
luser droog

同じ名前を使用すると名前の衝突が発生した古代のコンパイラとの互換性:

構造名がtypedef名と異なるのはなぜですか?

これは、構造タグ、共用体タグ、およびtypedefが同じ名前空間に保持されていたC言語のごく初期のバージョンからの引き継ぎです。その結果、あなたはtypedef struct XYZ { ... } XYZ;。左中かっこで、コンパイラはXYZを構造体タグ名として登録します。次に、XYZが2回目に表示されると、再宣言エラーが発生します。これに対する標準的な回避策は、最も一般的にはWordタグを前に置くことにより、構造タグ名をtypedef名の小さな変更にすることでした。

C言語の標準化プロセスにより、構造と型名の名前空間が分離されたため、この回避策は不要になりました。

(from なぜ構造名がtypedef名と異なるのですか?-古い新しいもの

7
CodesInChaos