C言語/typedef
表示
< C言語
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を活用することで、コードの可読性、保守性、移植性を高めることができます。特に複雑なデータ構造や関数ポインタを扱う場合に威力を発揮します。