前回はネームスペースの使い方に関して解説しました。実際、STLを使うくらいならそれだけで問題ないでしょう。
今回は、それを超えるパワフル(過ぎ)な使用方法を紹介しましょう。 |
ちょっとまった!! |
これから解説する方法は、鏑矢正伝が独自に考えたものです。つまり、他のライブラリ等では見かけない方法です。
もともとネームスペース自体、つい最近作られたもので、あまり広まっていません。また、規格自体、変わる可能性が非常に高いと思います。 つまり、これから解説する方法を使用することは高いリスクをともなうということです。 でも、その分に見合うものがあると思うので、とりあえず解説しましょう。 |
「ライブラリ」を囲む |
STLの例を見れば分かるように、ライブラリをネームスペースで囲むことは非常に有用です。たとえば、APIと同じ名前の関数を作成したいときなど、何も気にせずに作ることができます。
|
ヘッダーファイルを囲む |
ライブラリを囲むネームスペースの内側で、ヘッダーファイルごとにファイル名で囲みます。ヘッダーファイル内に複数の関数やクラスが存在する場合に有効です。
|
定数フラグに使う |
たとえば次のような関数を作成するとします。
|
int Test( int p_iFlag );
この関数は引数に「整数値のフラグ」を取ることが分かると思います。こういった場合、次のようにネームスペースを使用すると便利でしょう。
|
namespace TestF1 { const int iZyu = 0; //10を返します。 const int iHyaku = 1; //100を返します。 } //namespace TestF1
このようにネームスペースで囲むことで、先ほどの関数のためのフラグということがわかると思います(「F」は「フラグ」、「1」は「第1引数」という意味です)。このような形で関数と結びつけることで、グローバルな定数値をうまく管理することができます。
|
すべては「インテリセンス」のために!! |
さて、ここまで読んでる方の中で99%は「なんや、えらい使えんやないか。コーディング量増えるだけや」とお思いのことでしょう。しかし、この仕掛けはすべて、VC6.0から装備されたインテリセンスのためのものなのです!
前述の「ライブラリを囲むネームスペース」をKTLとします。このライブラリの中のクラスを使いたいとき、あなたは即時にKTL::と打ち込めばいいのです。そうすれば、KTLの中に含まれる各ヘッダーファイルのネームスペースが一覧表示されるでしょう。 今度はその中から、使いたいクラスが入っているヘッダーファイルを選び、::と打ち込めばいいのです。そうすれば、ヘッダーファイル内のクラスが一覧表示されて、そのなかから選べば、めでたくクラス名の入力完了、というわけです。 この方法を使用すると、次のような利点があります。 ・コーディング量が少ない:とにかく少ないです。ヘッダーファイル名やクラス名が長くても全然大丈夫でしょう。 ・コメントが表示される:一覧表示がされるときに、クラスや関数のコメントが表示されます。わざわざマニュアルやファイルを見なくても、どれを使えばいいのか分かると思います。 さらに、そのあと紹介した「関数のフラグ」の場合にも非常に便利です。Test(と入力した時点で、インテリセンスが引数の一覧を表示します。この中で第1引数に「p_iFlag」と書かれているのを確認したら、有無を言わさず「TestF1::」と入力してしまえばいいのです。 入力したら、フラグの一覧が表示されます。もちろんこのとき、フラグ毎の解説が表示されます。そのなかからひとつ選ぶだけで、フラグを引数にセットすることができるというわけです。 ……まぁ、入力は外部エディタでするという人や、まだVC5を使ってるという人もいることだとは思いますが、これを使い始めるともうやめられないでしょう。「コーディング」とは言えない、なんとも言えない楽な世界です(笑)。 |
インテリセンスのバグについて |
インテリセンスの、たぶんバグと思われる(仕様かもしんないけど)について書いておきます。
複数のヘッダーファイルを同一のネームスペースで囲んだ場合、なぜかそのうちのひとつだけしかネームスペースとして認識されません。これを回避する方法は、「ワークスペース」の「File View」で、「Header Files」の中に取り込んでしまえばOKです。 「プロジェクト」−「プロジェクトへ追加」−「ファイル」か、ワークスペース上のフォルダの上で右クリックから「フォルダへファイルを追加」を選べばファイルを追加できます。特に外部のライブラリの場合には、右クリックから「フォルダの新規作成」でライブラリ用のフォルダを作ってから、右クリックで追加すると分かりやすいでしょう(これらは物理的なコピー等ではなく、単に「プロジェクトから参照する」というだけの意味です)。 これらを行うことで、すべてが同一のネームスペースとして認識されます。STLもたびたびそうなることがあるので、よく使用するSTLのヘッダーファイルをプロジェクトに追加しておくと便利だと思います。 以上のようなことをしているのに、意味不明なことが発生する場合があります。存在しないネームスペースがインテリセンスの一覧として表示されたり(笑)。 この辺はプロジェクト等に格納されている情報から生まれる「亡霊」のようなものらしく、新しいプロジェクトにしたり、ネームスペースの名前を変えたりするとなくなったりします。また、ライブラリの方を書き換えることがなければ、こういったことは起きにくいと思います。 インテリセンスを使用するとコメントを表示できますが、ネームスペースにはコメントを着けることができません。ファイルの一番上の1行とかが表示されることがあったりします。まぁ、クラスや関数と違って、ネームスペースは同名ものものが複数存在するので、どれを表示したらいいのか迷ってしまうのかもしれません。 これは一応回避不可能です。分かりやすい名前を着けたり、ひとつのネームスペースにたくさんのネームスペースを入れないようにして工夫するのが一番でしょう。 |
キーアサイン |
インテリセンスを使用する場合に便利なキーアサインを書いておきます(キーアサインの変更は「ツール」−「カスタマイズ」−「キーボード」で行えます)。
・LineUp/LineDown:「カーソルを行ひとつ上へ」と「カーソルを行ひとつ下へ」ということで、カーソルキーの上下と同じです。これがインテリセンスの一覧表示でも使用できるので、カーソルキーに手を伸ばさず選ぶことができます。 ・CompleteWord:メンバの一覧表示がされてない状況で、名前の最初数文字を入力してからこのキーを押すと、確定できるのなら名前が確定表示され、いくつか候補があるなら一覧表示されます。ちなみにこれはローカル変数にも適用されるので、かなり便利です。 これ以外は「::」とか「(」を入力したり、マウスカーソルを上に持ってきたりするだけでできるので必要ないでしょう。 |
まとめ&警告 |
もう一度言いますが、これらを使用する場合にはそれなりのリスクを覚悟してください。上記のようなネームスペースの使い方は「読みやすさ」と「インテリセンスとの協力」のふたつが柱になっています。この方法をライブラリに用いて、そのライブラリを使用する方が普通のエディタを使用した場合にはかなり辛いことになると思います(using namespaceの嵐とか……)。
ま、こういう使い方もあるということで。 |
(C)KAB-studio 1999 ALL RIGHTS RESERVED. |