C++なのに、Cに毛が生えただけの「C~」を書いてないか?

C++は、摩訶不思議な言語ですが、その考え方は、いろいろと納得できる点が多い。

今や、C++は、単にclassのあるCではなく、様々な機能が付加された冒険的な言語になっていますが、これを楽しみながら使っていきたいと思っています。


君のソースはC++じゃなくCに毛が生えただけのC~だ


さて、ファイル拡張子は .cpp だけど、コメント // くらいしかC++の機能を使っていない的な、C++というよりはCに毛が生えた「C~」なプログラムを書いていませんか。
それは恐らく、とてもとても恥ずかしい事です。
malloc/freeを、new/deleteに置き換えるだけでもまだ足りない。

やはり、stdio.hとかincludeしないプログラムを書いていきたい。

classは無くてもプログラムは書けるけど、STLとかstd::stringは使うべきだし、色々と便利な機能で、使い方も簡単なものは目白押しです。

と言いながら、自分が大昔に書いたソースはC~であるので、今日は、「C++らしくないものは極力排除」する方法を書いてみます。

主な作業は次の二つ。

(1) #define BUFSIZE 1024 みたいなdefineは極力使わない
(2) マクロは極力使わない

そんなんで本当にプログラムが組めるのか不安になりますが、ちゃんと代替の方法があります。


定数は、#defineではなく、constで書く


const size_t BUFSIZE = 1024;

このように書きます。そのまま置換すれば、何の問題もなく動くでしょう。
C++的には、この値が「size_t」型であることが分かるため、重要です。C++は型にうるさい言語ですから。
そして、コンパイラはこれを定数とみなすので、どこかで変な処理があれば、size_t BUFSIZEがおかしいよ、と表示してくれます。#defineでは、そうは行きません。


マクロは極力使わない


C++では、テンプレートという機能があり、これで殆どが代替できます。
例えば、
#define RANGE(val, min, max) ( min <= val && val <= max )

みたいなマクロがあったとしましょう。不等号をつい書き間違えてしまう人は、こんなマクロを作った覚えがあると思います。

しかし、C++的には古い。今、ナウなヤングにバカウケで大フィーバーしている超トレンディな方法は、次の通りです。

template<typename T> inline bool InRange(T val, T min, T max) { return min <= val && val <= max; }

実体としてはboolを返すインライン関数になっています。型は明確に指定する必要があります。
VC++だと実行ファイルサイズは変わらないので、内部的には同じなのだと思いますが、こうするとC++らしいプログラムに早変わりです。

例えば、EUC-JPの範囲かな?と調べるとき、それをDWORD型変数に持っているとして、
if ((InRange(dwInChar, 0xa1, 0xfe))) ...
とか書くとエラーになります。
なぜなら、1番目はDWORDで、2番目と3番目は暗黙的にintだからです。

明確にするには、
if ((InRange(dwInChar, 0xa1ul, 0xfeul))) ...
とか書くことになります。

また、こんな感じに書くと
if (!(InRange<DWORD>(dwInChar, 0xa1, 0xfe)))
typename TがDWORDとなるので、良い感じになるようです。

どちらの書き方でも、型が明確になるので、変なバグが混入する可能性が減ってくれます。

2008/12/01(月)15:41 |Comments(0) |Trackback(0)

C++ | プログラミング | コンピュータ | [編集]

▲ページトップ

コメント

コメントの投稿

UTF-32 ホーム 出力のエスケープシーケンス
トラックバック

この記事にトラックバックする(FC2ブログユーザー)
▲ページトップ

カレンダー

03 | 2017/04 | 05
- - - - - - 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 - - - - - -

プロフィール

miraicorp

Author:miraicorp
未来情報産業(株) 社長

主として「ICカードこれひとつ」や「文字、文字コード」処理、時々C++などについて記述しています。

twitterツイッター

管理用

検索フォーム

お知らせ

コメント等お気軽にどうぞ。

気に入ったら拍手して頂けると、今後の記事を書く際の参考や励みになります。

■お仕事を募集しております
ソフトウェア製造の仕事や、原稿執筆の仕事などを随時受け付けております。
お気軽にご相談下さい

■初めての方へ
こまごまと更新しているため、他にも関連する記事があるかもしれません。
「月別アーカイブ」「検索フォーム」「カテゴリ」などをお試し下さい。
トップページはこちら

最新記事

最新コメント

最新トラックバック

月別アーカイブ

カテゴリ

広告枠

メール

メールはこちら

リンク

このブログをリンクに追加する

RSSリンクの表示

QRコード

QR