[解決済み] なぜC言語では構造体を頻繁にtypedefする必要があるのですか?
2022-03-19 03:10:11
質問
以下のような構造で構成されたプログラムを多く見かけます。
typedef struct
{
int i;
char k;
} elem;
elem user;
なぜ頻繁に必要なのでしょうか?具体的な理由や該当箇所は?
解決方法は?
Greg Hewgill が言ったように、typedef を使うと、もう
struct
があちこちにあります。キーストロークを節約できるだけでなく、抽象度が少し上がるので、コードをよりきれいにすることができます。
のようなものです。
typedef struct {
int x, y;
} Point;
Point point_new(int x, int y)
{
Point a;
a.x = x;
a.y = y;
return a;
}
というキーワードが不要になり、まるで本当にポイントという型があるかのように見えるので、とてもすっきりします。これは
typedef
ということなのでしょう。
また、あなたの例では(そして私の例でも)名前付けが省略されていますが
struct
というように、名前をつけることは、不透明な型を提供する場合にも有効です。例えば、ヘッダーにこのようなコードを記述します。
typedef struct Point Point;
Point * point_new(int x, int y);
を指定し、その後に
struct
の定義を実装ファイルに記述します。
struct Point
{
int x, y;
};
Point * point_new(int x, int y)
{
Point *p;
if((p = malloc(sizeof *p)) != NULL)
{
p->x = x;
p->y = y;
}
return p;
}
この後者の場合、Point の定義がヘッダーファイルのユーザーから隠されているため、Point を値で返すことはできません。これは、以下のような手法で広く使われています。 GTK+ 例えば
アップデイト
なお、評価の高いC言語プロジェクトでは、このような
typedef
を隠すために
struct
は悪い考えだと考えられています。Linuxカーネルはおそらく、そのようなプロジェクトの中で最もよく知られています。の第5章をご覧ください。
Linux Kernel CodingStyle ドキュメント
は、ライナスの怒りの言葉です :) 私が言いたいのは、質問の中の "should" は、結局のところ、定まったものではないのだろうということです。
関連
-
解決済み] g++ コンパイルエラー: ')'トークンの前に一次式があることが予想される
-
[解決済み] 型付けされた関数ポインタ?
-
[解決済み] SQLiteのINSERT/per-secondのパフォーマンスを向上させる
-
[解決済み] C言語のコードで「:-!」とは何ですか?
-
[解決済み] C++でクラスと構造体はいつ使い分けるべきか?
-
[解決済み] Objective-Cのtypedef enumとは何ですか?
-
[解決済み] C++11の'typedef'と'using'の違いは何ですか?
-
[解決済み] C++の'struct'と'typedef struct'の違い?
-
[解決済み] 構造体のsizeofは、なぜ各メンバーのsizeofの合計と等しくないのですか?
-
[解決済み] Cの構造体を別の構造体に割り当てる
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】typedef struct と struct の定義 【重複】typedef struct と struct の定義。
-
[C] レポートエラー 代入の左オペランドとしてlvalueが必要
-
コンパイルエラー:可変長オブジェクトが初期化されていない可能性があります。
-
[解決済み] flexible array member not at end of structエラーの原因は何ですか?
-
[解決済み] C言語で配列のサイズを決定するにはどうすればよいですか?
-
[解決済み] mallocとcallocの違い?
-
[解決済み] C言語のi++と++iに性能差はあるのでしょうか?
-
[解決済み] なぜC言語では構造体を頻繁にtypedefする必要があるのですか?
-
[解決済み] フリーは、どのように無料化を知っているのですか?
-
[解決済み] C言語の構造体(CGRectやCGPointなど)をNSLog化することは可能ですか?