※本記事は広告を含みます。
C言語文法解説シリーズ
本記事は「C言語文法解説シリーズ」の1つです。
C言語の文法を、組み込み開発の視点も交えて解説します。
C言語には、型に別名をつけるためのキーワードがあります。
それが typedef です。
typedef を使うと、長い型名を短く書けるようになります。
例えば
unsigned long counter;typedef を使うと
typedef unsigned long ULONG;
ULONG counter;と書けます。
ただし typedef は単なる省略ではありません。
struct やポインタと組み合わせると、可読性や設計に大きく影響します。
この記事では typedef の意味と使い方を、初心者向けに順番に解説します。
typedefとは
typedef は型に別名をつけるキーワードです。
typedef 元の型 別名;例
typedef int INT;すると
INT a;と書けます。
これは次と同じ意味です
int a;つまり typedef は
新しい型を作るのではなく、型の別名を作るだけ です。
typedefの主な用途
typedef の主な用途は3つです。
① 型名を短くする
② struct を使いやすくする
③ 抽象化(設計)に使う
型名を短くする
例えば
unsigned char value;毎回書くのは長いです。
typedef を使うと
typedef unsigned char uint8;
uint8 value;読みやすくなります。
structを使いやすくする
通常の struct
struct User {
int id;
};変数宣言
struct User user;毎回 struct が必要です。
typedef を使うと
typedef struct {
int id;
} User;使用
User user;すっきり書けます。
structの使い方についてはこちらの記事で解説しています。
typedefはstruct名とは別
このコード
typedef struct {
int id;
} User;ここで作られる型は
Userだけです。
実は
struct Userという型は存在しません。
つまりこれはエラー
struct User a; // エラーstruct名を付けていないからです。
struct名も付ける書き方
struct名も使いたい場合
typedef struct User {
int id;
} User;これで両方使えます。
User a;
struct User b;ポインタ宣言の基本(ここ重要)
まずこれを理解する必要があります。
int* a, b;多くの人はこう思います
a → int*
b → int*でも違います。
実際はこうなります
a → int*
b → intなぜこうなるのか
理由は
* は型ではなく変数にかかる
この宣言はこう解釈されます
int *a;
int b;つまり
int* a, b;は
- a はポインタ
- b は普通の int
になります。
これがC言語の重要なルールです。
typedefでポインタを作る
次に typedef
typedef int* intptr;これは
intptr = int*という意味です。
だから
intptr a, b;はこうなります
int* a;
int* b;普通の宣言との違い
普通の宣言
int* a, b;↓
int* a;
int b;typedef
typedef int* intptr;
intptr a, b;↓
int* a;
int* b;ここが混乱ポイントです。
危険なケース
typedef int* intptr;
intptr a, b;
b = 0;これは
int* b;
b = 0;つまり NULL ポインタになります。
さらに
*b = 0;と書くと
NULL参照でクラッシュします。
さらに危険
typedef int* intptr;
intptr b;
*b = 0;これは
int* b; // 未初期化
*b = 0;未定義動作になります。
安全な書き方
ポインタtypedefは避けるのが安全
NG
typedef int* intptr;OK
typedef int INT;
INT* a;
INT* b;これならポインタかどうか分かります。
struct typedefは安全
typedef struct {
int id;
} User;使用
User user;
User* ptr;ポインタが明確に分かります。
まとめ
typedef は型の別名を作るキーワード
typedef int INT;struct と組み合わせると便利
typedef struct {
int id;
} User;ポインタtypedefは注意
typedef int* intptr; // 誤解しやすい代わりに
typedef int INT;
INT* ptr;の方が安全です。
この記事が参考になった方へ
C言語の基本文法を一覧で整理しています。
技術に関するご相談・開発・自動化ツール作成・記事執筆などのご依頼も承っています。
小さなご相談からでもお気軽にご連絡ください。

コメント