1. ホーム
  2. c

[解決済み] なぜ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" は、結局のところ、定まったものではないのだろうということです。