Cの構造体のプライベートメンバ

2008年5月18日- Ĉで掲示される/ C + +の

今週は、ここで働いてグラムでコンパイルするより証拠のプログラミングパラダイムを完全に言語に依存しない、という事実は、C言語でプログラミングしている+の例は+されていた+ +コードをオブジェクトになります指向これほど少ないのは、ANSI Cでのコードは必ずしも構造化されるか、オブジェクト指向プログラミングができなくなります場合は、プログラムです。

私は右を読んでいる、オブジェクト指向、ANSI Cで?

yesとno!

継承、ポリモーフィズム、オーバーロードのようなものを複雑に/ C言語でエミュレートするが、することができますプログラムは、同様に動作するスタイルを使用してオブジェクト指向する。 libdfb C言語では""オブジェクト指向なので、その場合は、作成する要素は、非常に類似したオブジェクトへの動作を破壊する操作が書き込まれます。

ここでの仕事では、C言語でハードウェアの抽象化は、GUIをC言語での接続は、システム+が+。 C言語で最下位層にも(そして非常によく書かれた方法で見分ける)は、これらのテクニックを、オブジェクト指向をシミュレート書かれています。 これらの技術を、私はCの本のこれらの脚注を使用して感銘を受けました

ときにCコードをコンパイルすると、各シンボルの場合を除き、再度、他のユニットなど作らないとして記載されてだけで、それが宣言されたコンパイルユニット内に表示されます したがって、それは""は、コンパイルユニット内の特定のシンボルを非表示にするため、外の世界にアクセスできないことが可能です。 我々は、このパッケージを使用している。

コンパイル単位のファイルの設定され、後に事前処理し、単一のオブジェクトコードを生成するコンパイルされます。 基本的に(しかし、そうではない)、私たちを取ることができますが、各コンパイルユニットの実装ファイルのソースコード(*. cに、*. cppを。その他)。 CおよびCをコンパイルする手順についての詳細+ + ブログCaloniで発見することができます

この情報を使用して、我々は、ANSI Cでは、その内部のメンバー"プライベートな構造体"を作成することができます。 魔法のトラップのメンバーの定義では、コンパイル単位内にあると、これらのメンバへのアクセスメソッドを作成します。 この私たちは、私たちの宣言とCの要素の定義の違いを見るの脚注を使用する場合:

宣言またはマニフェスト:コンパイラも、その意味や、コンパイラは、識別子XXXは教えてくれる言うまでもないが、識別子を提示ほとんど彼は何を表すかについては知られている。
例えば、

  a ; 作らない int型 で;
 void ) ; 無効何とか(無効);
 構造 st_date; 

定義と実装:コンパイラは、識別子など、どのくらいのメモリはこれに割り当てられる必要があるメモリアドレスは、他の事柄の間では何を見つけることができるように決定さに指示します。
例えば、

  int;
 void ) { /* Do anything. 無効何とか(無効)(/ *何もしないでください。  * /)
 /* Some members. (/ *いくつかの 構造体の メンバst_date。  * /) 

ときに我々の構造と種類のコンパイラを設定することなく話すので、何もどれだけのスペースを入力する必要の変数について知られている彼らのためにメモリを割り当てる方法はありません。 宣言は、他の一方で、時にはせずに、リンカは、そのシンボルの存在を知ることはできません。

するときにはヘッダには、通常、我々もそこには私たちのソースには、このヘッダーを追加するたびに、そのメンバーを定義する構造体を宣言、我々のコンパイル単位でこの構造体の定義として、その文のソースとしては、パブリックinterinstitutionalcollaborationのメンバに含まれてこのコンパイル単位に。 これは私たちのメンバーに直接アクセスすることができます。

もし我々だけの記号は、構造の利用ではなく、そのメンバを表すの定義のステートメントを区切ります。 したがって、任意とすると、コンパイルエラーが生成されるメンバに直接アクセスします。 興味深い側面を効果として、コンパイラは、構造体のサイズについては何も知っている場合は、直接構造体の変数を設定することはできません、それへのポインタだけので、ポインタはすべて同じサイズとは、コンパイラのみのシンボル名が必要型のポインタを作成する。

それから、このようなヘッダーmytype.hものがある:

  #ifndefのMY_TYPE_H
 MY_TYPE_H定義#

 / *のtypedefだけでなく単語の構造を繰り返し続けることです。  * /
 / *文の単語だけです:* /
 / *構造体_MYTYPE * /
 型定義typedef _MYTYPE my_type 構造 ;

 my_type ** ) ; 無効 create_my_type(my_type **);
 my_type ** ) ; 無効 destroy_my_type(my_type **);

 my_type * , int ) ; 無効 set_data(my_type *、int)を;
 my_type * ) ; int get_data(my_type *);
 my_type * , const char * ) ; 無効 set_text(my_type *、 ポーラ文字 *);
 get_text ( my_type * ) ; 文字 * get_text(*)my_type;

 #Endifに 

実装mytype.c:

  #"mytype.h"を含む

 #含まれて<stdio.h>
 #含まれて<stdlib.h>
 #含まれて<string.h>

 /* Aqui fica a definição da estrtura. _MYTYPE 構造体 (/ *ここでestrturaの定義です。  * /
     /* Somente depois disso é que o com-  */ int データ / *のみ後は、と- * /
     21 ] ; /* pilador vai saber como alocá-la. intテキスト[21]、/ * piladorどのように割り当てることが分かるだろう。  * /
 /* Tente um sizeof(my_type) no main. )、/ sizeof主に(my_type)をお試し*。  * /

 my_type ** my_ptr ) { /* some code... 無効 create_my_type(my_type ** my_ptr)(/ *いくつかのコード...  * /)
 my_type ** my_ptr ) { /* some code... 無効 destroy_my_type(my_type ** my_ptr)(/ *いくつかのコード...  * /)
 my_type * my_ptr , int d ) { /* some code... 無効 set_data(my_type * my_ptrは、INT  )(/ *いくつかのコード...  * /)
 my_type * my_ptr ) { /* some code... int get_data(my_type * my_ptr)(/ *いくつかのコード...  * /)
 my_type * my_ptr , const char * text ) { /* some code... 無効 set_text(my_type * my_ptr、 ポーラchar *亡 )(/ *いくつかのコード...  * /)
 get_text ( my_type * my_ptr ) { /* some code... 文字 * get_text(my_type * my_ptr)(/ *いくつかのコード...  * /) 

完全なソースコードの例をここで見つけることができます

ので、直接この型の変数を作成することはできません、私たち"と"デストラクタ""ビルダーを定義します。

メンバーに直接アクセスするためにしようとするとコンパイルエラーが生成さ:

  private-struct-members$ gcc -o teste mytype.h mytype.c main.c user @ hostは:〜/プライベート構造体、メンバー$ gccの- oテストmain.c mytype.h mytype.c
 main.c:には関数'メイン':
 main.c:22:エラー:間接参照ポインタが不完全 private-struct-members$ user @ hostは:〜/プライベート構造体、メンバー$ 

したがって、少し創造し、両方の言語とパラダイムの概念とは、コードを実装するために本当に面白いことが可能です。 この愚かな例では、されてエミュレーションパッケージまたはコンストラクタの使用を強制的有用性/ Cのデストラクタが、明確にしていない可能性がありますシステムでは状況は、Cは許可されません+ +、または複雑なレベルで、このような技術に到達する傾向がある大きな価値を示しています。 我々の場合では、この手法を具体的には、全体のプロジェクトをやっていない経験豊富なプログラマー許可され、彼は彼の試み構造体のメンバに直接アクセスすると、コンテンツ不適切な動画を発見した。 それがなければ、バグcabulosoロジックを実行時にのみ、このソフトウェアはおそらく、顧客の顔を爆発させる意思表示だ。

役に立つリンク...):(かどうか
http://www.directfb.org
http://www.caloni.com.br
http://www.numaboa.com.br/informatica/c/
紙の開発Linuxカーネル

コメント

C"のプライベートメンバには、7レスポンスの構造"

  1. ディオゴ五 6月10日日16:40 Kersting

    ここで私はソースコードをダウンロードできますか?
    http://blabos.org/blog/wp-content/uploads/2008/02/stopwatch.zip

  2. 6月にベラベラしゃべる、2008 23:12 10

    おやすみなさい、

    ご清聴ありがとうございました。

    私は結局壊れているブログのサーバーといくつかのリンクを変更してきた。 私はそれを解決します。

    抱擁

  3. 6月にベラベラしゃべる日23:58第10回

    として、権利が約束

    抱擁

  4. 6月にベラベラしゃべる11、2008 00:00

    私は、ここもしかして:

    http://src.blabos.org/blog/posts/17/stopwatch.zip

  5. ロドリゴマルチンス(ウォーロック)2008年7月1時半15日

    これは、新しいハァッAHHuahuAHUahuA何かをポストする時が来た

  6. 7月にベラベラしゃべる15日2008年9:09

    魔女はい、正しいが、しているチosso ...

    幸いなことに、私はオーブンで何かをして :)

    抱擁

  7. Carcara 10月に、2008午後1時14月27日

    また、外部のコンパイル単位staticでそれらを宣言する機能を隠すことができる - これはまた、グローバル変数はtrueです。 このように、外付けドライブが存在し、関数は作らないで別のファイルとして宣言されるのを防ぐ静的知っていることはありません。

返信コメントを残す




WPのHashCashので電源