かしこいtypedef

yuki
記事: 5
登録日時: 14年前

かしこいtypedef

投稿記事 by yuki » 14年前

C/C++では型を自由に作ることが出来ます。
enum, union, struct, class ...
それらには名前があり、大方名前で中身の想像できます(というより想像出来るような名前を付けるべき)

しかし基本型の名前は、整数である、浮動小数点数である、などの情報しか持ちません。
char, int, float, double, bool ...
なぜなら、変数に意味のある名前をつけるべきだからです。
(そういうこともあって、XClass xclass;なんていう変数のつけ方が出来上がるわけですが)

では、元々からあるtypedefされた型で有名なものの一つ、size_tについて書いていきます。

環境にもよりますが、size_tは私の環境ではこうなっています。

CODE:

typedef unsigned int size_t;
んじゃあ、size_tなんて書かずにunsigned intって書けばいいんじゃないの?何型の値を渡せばいいか一目でわかるし。
と思った方。
確かに、整数型を渡せばいいんだなというのはわかります。
では、実際にどんな値を渡せばいいのでしょうか。
何かの長さでしょうか。固有IDでしょうか。何もわかりません。

ではこれがsize_tとなればどうでしょう。
何かしらのサイズを渡せばいいんだなということがわかります。



さて最近よく、C++を使っているにもかかわらず、

CODE:

typedef struct tagHoge
{
} Hoge;
なんてことをやっている人が居ますが、無駄ですので今すぐやめましょう。
多分100%近い人がその意味を知らずに使っています。
だってWindowsAPIの宣言もそうなってるし…

そりゃそうです。
C++よりも古いのですから。
知ってる人大多数でしょうけど、知らない人がこれから先意味のないことをしないように書いておきます。
Cの時代は構造体型の宣言を行うとき、いちいちstructキーワードを使わなければならなかったのです。
例えば上のHoge型のfugaを宣言する場合はこうです。

CODE:

struct Hoge fuga;
Hogeは構造体なのでそれを表すstructキーワードを付けなければなりません。
そこでtypedefしてワンクッション噛ませることにより、その必要を無くしているのです。
これがCです。

しかしC++になってからその制約がなくなりました。
内部で自動的にtypedefされているからです。
ですので、今までワケも分からず先人の知恵を借りたつもりでやってたtypedef structやtypedef enumは一切やめましょう。
typedefの正しい使い方ではないし、全くもって冗長で無駄ですので。



もう一つ。
テンプレートクラスでは、大いに力を発揮します。
STLを使う人は分かると思いますが、テンプレートクラスを使うと型名が長くなる傾向に有ります。
なぜなら、いちいち型名はテンプレート引数を一致させる必要があるので、いちいち長くなります。
当然打ち間違ってコンパイルエラーなんてこともありえます。
そんなときも、typedefで別名を宣言してやれば解決します。



ここまで長くなりましたがそんなこんなで皆さん、typedefを賢く、そして正しく使いましょう!
(ここまで書いて記事の内容が正しくなかったらどうしようと思ったり思わなかったり…)
最後に編集したユーザー yuki on 2010年11月04日(木) 00:45 [ 編集 1 回目 ]

アバター
あーる@Reputeless
記事: 84
登録日時: 14年前

Re: かしこいtypedef

投稿記事 by あーる@Reputeless » 14年前

size_t と書くだけで、これはサイズを表す値なんだとわかる・・・
仕様をコメントじゃなくて、コードで語れるってのがいいですよね。

アバター
パコネコ
記事: 139
登録日時: 14年前

Re: かしこいtypedef

投稿記事 by パコネコ » 14年前

C++ではなくC言語を基本に勉強しているのですが、C++ではの話ですよね。
一度、C++で使えたからCで使ったらエラー出て悩んだことありました・・・

あれ?あの時どうやって直したんだっけ?
もう忘れちゃいました(笑)

yuki
記事: 5
登録日時: 14年前

Re: かしこいtypedef

投稿記事 by yuki » 14年前

コメントありがとうございます。

>あーるさん
そうですねー。コメントは最小限にし、一瞥するだけでなんとなくでも処理の意味が分かるようなプログラムを書きたいものです(^^

>パコネコさん
そうです。C++が前提です。
C言語の仕様では省略不可ですが、C++をベターC的に使ってる人(主に初学者)がこれをやってることがあったので…
ともあれC++やってCに移るとき、憶えてないと詰まりそうで怖いですね(^^;

ISLe
記事: 2650
登録日時: 14年前

Re: かしこいtypedef

投稿記事 by ISLe » 14年前

> 内部で自動的にtypedefされているからです。
C++でstructはclassと同じようにクラスを定義するキーワードです。
classではメンバのデフォルトのアクセス修飾がprivateですが、structだとpublicになるところだけが違います。

CとC++で共有するヘッダファイル(WindowsAPIとか)の構造体定義はCでもstructを付けずに済むようにtypedefして欲しい気がします。

アバター
山崎
記事: 2
登録日時: 14年前

Re: かしこいtypedef

投稿記事 by 山崎 » 14年前

おお~、ためになる日記ですね~っ!

私は頭のどこかで「typedefは可読性を損なわす前時代の悪しき遺物」と考えていました。C++時代にはtypedefは必要ないとさえ思っていたのですが、どうやらそんなことは無いみたいですね。

まだ私はあまり長い型名を扱わなければいけない場面に出会ったことは無いですが、必要に応じてtypedefを使えるよう心に留めておきたいと思います。

大熊猫
記事: 16
登録日時: 14年前

Re: かしこいtypedef

投稿記事 by 大熊猫 » 14年前

確かにためになる記事ですね~。 1年ぐらい前に読みたかった・・・

>>テンプレートクラスでは、大いに力を発揮します。
私もこれには世話になってます。最初の頃は「もっと楽な書き方は無いのかなー」て悩みました。

それとクロスプラットフォーム用のライブラリもどきを作った時にも結構typedefの世話になった気がします。

yuki
記事: 5
登録日時: 14年前

Re: かしこいtypedef

投稿記事 by yuki » 14年前

コメントありがとうございます<(__)>

>ISLeさん
そこは臨機応変に変えるべきなんでしょうね…。
今読み返してみるとtypedef structを全撤廃しろみたいな書き方をしていますが、使いどころや意味を踏まえていれば何も差し支えないんです。
でも、何も知らずになんとなく使ってたりする人よ良く見かけたのでこういう書き方になってしまいました(^^;

>山崎さん
ありがとうございます。
確かにtypedefをすると、たちまちそれが何型なのかが隠れてしまいます。
しかし、それはヘッダファイルを見ればいいだけですし、統合環境を使ってる人は右クリックから宣言に飛ぶこともできますしね。
長い型名に限らず、テンプレートクラスはtypedefをするのが吉だと思います。

>大熊猫さん
ありがとうございます。
そうですね。typedefをすると移植性も高まります。
その面だけでも、typedefは使えると思っています。

ISLe
記事: 2650
登録日時: 14年前

Re: かしこいtypedef

投稿記事 by ISLe » 14年前

わたしの知る範囲ではtypedefの使い方云々以前に"typedef struct"でひとつの命令だと思っている人が少なくないですね。
入門書などで特に説明もなくそれだけが出てくるので刷り込みを受けてしまってのちに正しく意味を理解してもなかなか切り替えできないようです。