C における前方宣言と構造体と Typedef 構造体の違い

Atika Islam 2023年10月12日
  1. C プロジェクトを作成する
  2. C言語の構造体
  3. Cのtypedef
  4. C の typedef 構造体
  5. C の前方宣言
C における前方宣言と構造体と Typedef 構造体の違い

このチュートリアルでは、struct の概念と typedef キーワードの使用について説明します。 また、C における 前方宣言 の概念についても説明します。

Cプロジェクトを作成することから始めましょう。

C プロジェクトを作成する

  • 最初のステップは、コンパイラをインストールすることです。 Cコンパイラをダウンロードしてインストールする手順.
  • 次のステップでは、メニューバーのファイルをクリックして、C 言語で空のプロジェクトを作成します。

    新規プロジェクトの作成

    プロジェクトタイプの選択

  • コンパイルする前にファイルを保存します。
  • コードを実行します。 コンパイルして実行 をクリックします。

    コード実行プロセス

  • 実行画面が表示されます。

    実行画面

C言語の構造体

Struct は、関連する データ メンバー グループを作成するために C 言語で使用されます。 構造体のメンバーは同じデータ型を持っておらず、グループには異なる変数が 1 か所に保持されています。

ご存知のように、その配列には同じ型のメンバーがありますが、構造体では、データ メンバーは intfloat、および char のように異なる型にすることができます。 次のコード スニペットでは、C 言語で構造体を作成する方法について説明します。

このコードでは、構造体名 とその 変数 を記述して、メイン関数ローカル スコープ で変数を宣言しています。

コード例:

#include <stdio.h>
struct Student {  // Structure declaration
  int rollno;     // Member (int variable)
  char gender;    // Member (char variable)
};                // End the structure with a semicolon
int main() {
  struct Student s1;  // Making a variable of a struct
  s1.rollno = 3;      // assigning value to every member using dot operator
  s1.gender = 'M';
  printf("The name and gender of a student is %d and %c", s1.rollno, s1.gender);
}

出力:

The name and gender of a student is 3 and M

次のコードでは、変数をグローバル スコープで宣言します。

コード例:

#include <stdio.h>

struct Student {  // Structure declaration
  int rollno;     // Member (int variable)
  char gender;    // Member (char variable)
} s1;  // Declared a variable s1 before ending the struct with a semicolon
int main() {
  s1.rollno = 3;  // calling a member using a variable
  s1.gender = 'M';
  printf("The name and gender of a student is %d and %c", s1.rollno, s1.gender);
}

出力:

The name and gender of a student is 3 and M

これでも同じ出力が得られますが、上記のコード スニペットでは、変数 s1 をグローバルに宣言しています。 main() 関数で構造体を定義する必要はありません。

Cのtypedef

typedef は C 言語で使用され、既存のデータ型の名前を新しいものに変更します。

構文:

typedef<existing_name><alias_name>

最初に、typedef予約語 を記述し、次に C 言語で既存の名前、および割り当てたい名前を記述します。 typedef を使用した後、プログラム全体で alias_name を使用します。

コード:

#include <stdio.h>
void main() {
  typedef int integer;  // assigning int a new name of the integer
  integer a = 3;        // variable is declared by integer
  integer b = 4;
  printf("The values of a and b are %d and %d", a,
         b);  // print value of a and b on the screen
}

出力:

The values of a and b are 3 and 4

C の typedef 構造体

main() 関数に全体の構造体定義を書かなければならないことがわかりました。 毎回 struct student を書く代わりに、typedef を使用して古い型を新しい型に置き換えることができます。

Typedef は、C 言語で型を作成するのに役立ちます。

コード例:

#include <stdio.h>   // including header file of input/output
#include <string.h>  // including header file of string

typedef struct Books {  // old type
  char title[30];       // data members of the struct book
  char author[30];
  char subject[50];
  int id;
} Book;  // new type

void main() {
  Book b1;  // variable of a new type

  strcpy(b1.title, "C Programming");          // copy string in title
  strcpy(b1.author, "Robert Lafore");         // copy string in author
  strcpy(b1.subject, "Typedef Struct in C");  // copy string in subject
  b1.id = 564555;                             // assigning id to variable

  printf("Book title is : %s\n", b1.title);  // printing book title on screen
  printf("Book author is : %s\n", b1.author);
  printf("Book subject is : %s\n", b1.subject);
  printf("Book id is  : %d\n", b1.id);
}

出力:

Book title is : C Programming
Book author is : Robert Lafore
Book subject is : Typedef Struct in C
Book id is  : 564555

上記のコードでは、セミコロンの前の構造体の末尾に新しい構造体型を定義しました。 次に、その新しい型を main() 関数で使用しました。

この typedef により、main() 関数で毎回 struct を定義して変数を作成する手間が軽減されました。

C の前方宣言

前方宣言は、構造体の実際の定義に先行する宣言です。 定義は利用できませんが、事前宣言である前方宣言により、宣言された型を参照できます。

このメソッドは、関数の定義と宣言に使用されます。 main() 関数の上に関数を定義する代わりに、それを上で宣言し、下で定義することができます。これは前方宣言と呼ばれます。

コード例:

#include <stdio.h>
int add(int x, int y);  // (prototype)function declaration

void main() {
  int n1, n2, sum;
  scanf("%d %d", &n1, &n2);                    // taking numbers from user
  sum = add(n1, n2);                           // call to the add function
  printf("The sum of n1 and n2 is %d ", sum);  // display sum on the screen
}
int add(int x, int y)  // function definition
{
  int result;
  result = x + y;
  return result;  // returning the result to the main function
}

上記のコード スニペットは、main() 関数の先頭で関数プロトタイプを宣言したことを示しています。 定義する前に main で add() 関数を呼び出しますが、プロトタイプが既に定義されているため、正常に動作します。

これは前方宣言によるものです。

出力:

4 5
The sum of n1 and n2 is 9