スポンサーサイト

--年--月--日 --:--

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

おぱくえ

2005年10月18日 12:05

さてさて、今度は仕事でもやってるプログラムのことを。

今日、nVidia の CGToolKit をぼーっと眺めていたら、懐かしい表現が出てました。
オペーク型(スペルは opaque 和名:不完全型)っていうんですけど、あまり知りませんよね。
あるけ がこれをはじめて知ったのは某コンシューマゲーム機のミドルウェアをいじってる時です。

C++ で使う mutable と同じぐらい、名前の使用頻度があまりなさそうな気がします。


んでもって、このオペーク型、何に使うかといいますと、、、
C言語でカプセル化を行うときに使用します。
ライブラリ提供者がライブラリ使用者に対して構造体にアクセスするのを禁止したいときですね。
(ライブラリ駆動情報など重要な情報で改変されるとライブラリが正常に機能しなくなる場合など)

C++では private 宣言があるのでまったく使う必要がありませんが、C言語で隠蔽化を行おうとすると、
これを使わなければできません。

んでもって、これの書き方はというと、、、

通常の構造体宣言では、

 //!< プロトタイプ宣言
 typedef struct tagHuman,     *LPHUMAN;
 
 //! 実態宣言
 struct tagHuman
 {
   char  name[0x100];
   int  age;
 };
 
 
なんてヘッダーに書いたりしますが、
オペーク型にしたい場合は、ヘッダーに構造体情報を書きません。
要するに、プロトタイプ宣言だけ書くわけですね。

 //!< プロトタイプ宣言
 typedef struct tagHuman,     *HHUMAN;
 
こうすることで、構造体のメンバを隠蔽することができるわけです。
けど、「そんなことして大丈夫なの?」って思いますよね。
実は、ここで上に上げた例でちゃんと動くように、ちょっといつもと異なる部分があるんです。
普通、typedef 宣言した場合、実態も宣言しますよね。

 typedef struct tagHuman,     HUMAN, *HHUMAN;

こんな感じに。
けど、上の例ではポインタ型しか宣言してません。
実は、ポインタ型だけ宣言することで、メンバ情報などの実態宣言を省略することができるのです。
要するに、HHUMAN だけを渡すような関数を使用する分には、 tagHuman 構造体の中身を知らなくてもいいわけなので、
リンカも詳しく突っ込んでこないんですね。

もし、ポインタじゃなくて、インスタンスを生成するような HUMAN を一緒に typedef してしまった場合は、
実態宣言ももちろん必要になります。
(リンカが「おまい、どこにも実態がないやんかボケ」と突っ込んでくる)

ライブラリの中でだけ意味が通じればいい構造体などを利用する場合はオペーク型を使用すると便利だしスマートです。



こうやって突然思いついたこと、記録できるのは blog のいいところだね~。
スポンサーサイト


コメント

  1. みんなのプロフィール
    | URL | -

    ブログ開設おめでとうございます!!

    アクセス数を上げるために当コミュニティサイトに登録しませんか?
    http://blog.livedoor.jp/lpsdf1221/


    より多くのひとに貴方のブログを見てもらえます。

    参加するにはこちらからが便利です
    http://blog.livedoor.jp/lpsdf1221/?mode=edit&title=%82%DB%82%F1%82%B1%82%C2%82%C5%82%CE%82%A2%82%B7%20&address=http%3A%2F%2Fangra%2Eblog31%2Efc2%2Ecom%2F


    お問い合わせはコチラから
    http://blog.livedoor.jp/lpsdf1221/?mail

  2. kaizen | URL | g8BbYZcI

    Re:おぱくえ

    はじめまして。MISRA-C:2012というCのコーディング規約の例としてOpaqueを取り上げています。解説を書くために関連資料の一覧のURLを作成しています。こちらも一覧に掲載させていただいてよろしいでしょうか。昔、最初にC++をコンパイルしたのは、C言語のプリプロセッサとしてC++を実装したものでした。C++で書いたものをCPPにかけるとC言語としてコンパイルできるソースを生成する。それがちょうどOpaqueだったのでしょうか。最近、セキュリティに五月蠅くもなっているので、ひょっとしたら流行るかも。

  3. あるけ | URL | -

    Re:おぱくえ

    ながながと放置しているブログなので全然かまいませんよw

コメントの投稿

(コメント編集・削除に必要)
(管理者にだけ表示を許可する)

トラックバック

この記事のトラックバックURL
http://angra.blog31.fc2.com/tb.php/3-c17e26a5
この記事へのトラックバック


最近の記事


上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。