コンテンツにスキップ

C言語/typedef

出典: フリー教科書『ウィキブックス(Wikibooks)』

typedef

[編集]

typedef の基本概念

[編集]

C言語におけるtypedefは、既存のデータ型に対して新しい名前(別名)を定義するための機能です。これにより、コードの可読性向上やプラットフォーム間の移植性確保に役立ちます。

typedef の構文

[編集]

typedefの基本的な構文は以下の通りです。

typedef 既存の型 新しい型名;

例えば、整数型に新しい名前を付ける場合:

typedef int Integer;

Integer count = 10; // int count = 10; と同じ

typedef の利用例

[編集]

基本データ型への別名定義

[編集]
typedef unsigned int uint;
typedef float real;

uint positive_number = 42;
real decimal_value = 3.14;

配列型への別名定義

[編集]
typedef int IntArray[10]; // 10個のint型要素を持つ配列型

IntArray data; // int data[10]; と同じ

構造体への別名定義

[編集]
// 一般的な方法
struct Person {
    char name[50];
    int age;
};
typedef struct Person Person;

// 短縮方法
typedef struct {
    char name[50];
    int age;
} Person;

// 使用例
Person john = {"John Doe", 30};

関数ポインタへの別名定義

[編集]
typedef int (*MathFunc)(int, int); // int型引数2つを取り、int型を返す関数ポインタ型

int add(int a, int b) { return a + b; }
int subtract(int a, int b) { return a - b; }

MathFunc operation = add;
int result = operation(5, 3); // 8
operation = subtract;
result = operation(5, 3); // 2

typedef と複雑な型

[編集]

複雑な型定義もtypedefで簡潔に表現できます。

// 関数ポインタの配列
typedef int (*OperationArray[4])(int, int);

// int型の二次元配列
typedef int Matrix[3][3];

移植性のための typedef

[編集]

異なるプラットフォーム間でのコードの移植性を向上させるためにtypedefが利用されます。

/* プラットフォームに応じて適切なサイズに定義されるinteger型 */
typedef int int32_t; // 32ビット整数

/* システム依存の型 */
typedef unsigned long size_t; // オブジェクトのサイズを表す型

標準ライブラリでの typedef の使用

[編集]

C言語の標準ライブラリでは多くのtypedefが定義されています。

typedef名 実際の型 用途
size_t unsigned int または unsigned long メモリサイズや配列のインデックスを表す
time_t long または long long 時間(秒数)を表す
FILE 構造体 ファイル操作に使用
ptrdiff_t signed int または signed long ポインタの差分を表す

typedef と #define の違い

[編集]

typedef#defineは一見似ていますが、重要な違いがあります。

// typedef: 型に対する別名を定義
typedef unsigned int uint_t;

// #define: テキスト置換
#define UINT unsigned int

違いの例:

typedef char* string_t;
#define STRING char*
string_t s1, s2; // s1とs2は両方ともchar*型
STRING s3, s4;   // s3はchar*型だがs4はchar型(置換後:char* s3, s4;)

typedef とスコープ

[編集]

typedefで定義した型名は、通常の変数宣言と同じスコープルールに従います。

void function() {
    typedef int LocalInt; // このスコープ内でのみ有効
    LocalInt x = 10;
}
// ここではLocalIntは使用できない

typedef float GlobalFloat; // プログラム全体で有効

実践的な typedef の活用

[編集]
// リスト要素の定義
typedef struct node {
    int data;
    struct node* next;
} Node;

// コールバック関数の定義
typedef void (*Callback)(void* data);

// オブジェクト識別子の型定義
typedef unsigned long ObjectID;

このようにtypedefを活用することで、コードの可読性、保守性、移植性を高めることができます。特に複雑なデータ構造や関数ポインタを扱う場合に威力を発揮します。