第42回で列挙型、第44回で構造体を習得しましたが、これらをもう少し使いやすくする手法を習得します。
typedefのコンセプト
列挙型、構造体について忘れてしまっていたら、列挙型は第42回、構造体は第44回の記事を見返してみてください。
この列挙型と構造体ですが、列挙型と構造体の変数を宣言するとき、以下のようにしていましたよね。
// 列挙型の変数宣言
enum タグ名 変数名;
// 構造体の変数宣言
struct タグ名 変数名;
これはこれで特に問題ないと思いますが、もうちょっと簡単に変数宣言できればスケッチを書くのが楽になりそうです。まずは具体例で説明します。
キッチンタイマーの残り時間を表すために以下のように列挙型を宣言しました。
enum nokori {jyuubun, hanbun, mousugu};
この列挙型の変数を宣言する場合、例えば以下のように宣言します。
enum nokori nokori_jikan;
これはタグ名が「nokori」で宣言した列挙型として、nokori_jikanという変数を宣言してください、ということですが、もうちょっと簡単に「nokoriという型の変数を宣言してください」と書けた方がスケッチが楽になりそうです。具体的には、
nokori nokori_jikan;
というように変数宣言できれば、あたかもuint8_t型と同じようにnokori型の変数を宣言したように見えるわけです。
構造体も同様です。キッチンタイマーのスケッチは、メロディーデータを構造体にしました。構造体は以下のように宣言して、
struct oto {
uint16_t onkai;
uint16_t nagasa;
}
音階データと長さデータを組にしました。この構造体の変数を宣言する場合は、以下のように書きます。
struct oto alarm_melody;
先ほどの列挙型と同様に、構造体宣言もこれで特に問題ないと思いますが、以下のように「oto型」という変数型があればもう少しスケッチが楽にかけますよね。
oto alarm_melody;
このようなことを実現するために「typedef」という仕組みが用意されています。
「typedef」という仕組みは、このように自分で作った列挙型や構造体を、あたかもuint8_t型などと同じような変数型として使えるようにしてしまおう、というコンセプトなんです。
typedefの使い方
typedefは新しく型(type)を定義(define)するものです。書き方は以下のようになります。
具体的な例を確認した方が早いので、先ほどの「oto」という構造体を使ってtypdefの使い方を確認します。以下の構造体を「oto型」という新しい変数型として宣言する場合を考えます。まず構造体は以下のように宣言しました。
struct oto {
uint16_t onkai;
uint16_t nagasa;
}
これを「oto」型として宣言したい場合は、先ほどの書き方のように「typedef」と書き、続いて上の構造体を書いて、最後に新しい変数型の名前を書きます。
この例は、先ほどの書き方の色に合わせて書いていて、さらにそれぞれの項目の行を分けています。
ただ、この宣言だとエラーになってしまうんです。その理由ですが、「oto」という名前が2ヶ所に書かれてしまっているためです。一度使った名前は使うことができません。
そこで、typdefを使うときは、一般的に列挙型や構造体のタグ名の前に「 _ 」(アンダーバー/アンダースコア)をつける慣習になっています。
さらに、これも慣習ですが以下のようにtypedefの部分は「struct タグ名 { 」の部分まで1行に書き、最後の新しい型名は「 } 」のすぐ後に書くことが多いようです。
また、typedefで新しい変数型を定義する場合、タグ名は必要ないので以下のように省略することも多いです。いろいろなスケッチを見ていると省略するケースが多い印象があります。
このようにtypedefを使って宣言した構造体は、あたかも「oto型」という変数型のように以下のように使用することができます。
oto alarm_melody;
構造体や列挙型、enumはそれほど頻繁に使うことはないと思います。ただ、他の人が書いたスケッチではよく見かけますので、自分ではあまり使わなくても、このようなスケッチを読めるようにしておきましょう。
更新履歴
日付 | 内容 |
---|---|
2020.1.26 | 新規投稿 |
2021.8.27 | 新サイトデザイン対応 |
2022.2.18 | 誤字訂正 |