10

C言語で遅延バインディングを実現するにはどうすればよいですか?

4

6 に答える 6

8

実行時バインディングは、実際にはC言語自体の機能ではなく、実行環境が提供するものです。

多くのシステムは、リンカー/ローダーの機能として遅延バインディングを提供します。また、dlopen(共有ライブラリを開くため)やdlsym(ライブラリ内のシンボルのアドレスを取得してアクセスしたり呼び出したりできるようにするため)などの明示的な呼び出しを使用することもできます。 )。

C標準との遅延バインディングを取得する唯一のセミポータブルな方法は、いくつかのトリックを使用することでsystem()あり、それでも少なくとも部分的に実装固有です。

遅延バインディングについてあまり話しているのではなく、ポリモーフィズムについて話している場合は、関数ポインターを使用してその効果を実現できます。基本的にstruct、タイプのすべてのデータと、そのタイプのメソッドを見つけるための関数ポインターを持つを作成します。次に、「コンストラクター」(通常はinit()関数)で、その型に関連する関数への関数ポインターを設定します。

使用しない場合でも、すべてのコードを含める必要がありますが、その方法で多型を取得することは可能です。

于 2010-01-18T11:31:42.997 に答える
3

Cでのシンボルのバインドは、実行時にではなく、常にコンパイル時に行われます。

ライブラリバインディング、またはそれが呼ばれる動的リンクは、* nixを介して、およびdlopen()Windows上で実行されます。dlsym()LoadLibrary()GetProcAddress()

于 2010-01-18T11:31:13.280 に答える
1

Objective-CまたはLuaを使用してください。どちらもレイトバウンド言語であり、Cと簡単にインターフェースできます。

もちろん、独自の名前解決スキームを実装することもできますが、なぜ車輪の再発明を行うのでしょうか。

于 2010-01-18T11:39:40.433 に答える
1

C言語で遅延バインディングを実現するにはどうすればよいですか?

最も近いのは、Linuxでのdlopendlsymなどのライブラリ(DLL)の動的ロードによるものです。それ以外の場合は、で直接利用できませんC

于 2010-01-18T11:29:18.997 に答える
1

残念ながら、OSを指定していません。Unixの場合、共有ライブラリを使用するか、構成可能な(プラグイン)モジュール構造を作成できます。詳細については、Apache1.3Webサーバーのソースコードが役立つ場合があります。http://httpd.apache.org/download.cgi

于 2010-01-18T11:47:17.250 に答える
0

cppdevは、彼/彼女の発言でその場を打つ唯一の人のようです。定義自体をご覧ください。一言で言えば:

実行時バインディング、または動的バインディングは、オブジェクトに対して呼び出されているメソッドが実行時に名前で検索されるコンピュータープログラミングメカニズムです。

他のすべての答えは、「名前で調べる」という要点を見逃しているだけです。

必要なソリューションは、関数へのポインターのルックアップテーブルと、名前で(または署名でさえ)正しいものを選択するための1つまたは2つの関数に非常に似ています。これを「ハッシュテーブル」と呼びます。

于 2013-04-13T09:05:34.107 に答える