C言語で遅延バインディングを実現するにはどうすればよいでしょうか?
-
21-09-2019 - |
質問
遅れて達成する方法 バインディング C言語で?
解決
レイトバインディングは、あなたの実行環境があなたのために提供することをより多くの何か、本当にC言語自体の機能ではありません。
は多くのシステムは、リンカ/ローダの機能として結合繰り延べ提供し、あなたはまた、あなたができるように、そのライブラリ内のシンボルのアドレスを取得する(とdlopen
(共有ライブラリを開くために)などdlsym
として明示的な呼び出しを使用することができますアクセスそれまたはそれを呼び出す)。
が遅くなってC標準に結合するだけ半ポータブルな方法がsystem()
といくつかの策略を使用することも、少なくとも部分的に実装固有であることでしょう。
は、あなたが関数ポインタでその効果を得ることができます。基本的に、あなたはそのタイプの方法を見つけるための関数ポインタと一緒にタイプのすべてのデータを持っているstruct
を作成します。次に、の "コンストラクタ" の(通常はののinit()の機能)で、あなたはそのタイプに関連する関数への関数ポインタを設定します。
あなたはまだあなたがそれを使用していない場合でも、すべてのコードを含める必要がありますが、のの道という多型を取得することはできます。
であります他のヒント
シンボルは常に決して実行時、コンパイル時に行われます。
図書館、またはそれを呼び出してと動的リンクは、Windows上でdlopen()
との* nix上dlsym()
、およびLoadLibrary()
とGetProcAddress()
を介して行われます。
使用のObjective-CやLuaの。両方が容易Cとインターフェースすることができる遅延バインディングの言語である。
もちろん、あなた自身の名前解決スキームを実装することができますが、なぜ車輪を再発明する?
残念ながら、あなたはOSを指定していませんでした。 Unixでは、あなたは、共有ライブラリを使用するか、設定可能(プラグイン)モジュール構造を作成することができます。詳細については、あなたは便利なWebサーバのApache 1.3のソースコードを見つけることができます。 http://httpd.apache.org/download.cgiする
cppdevは一つであることが、唯一の彼/彼女の発言にスポットをヒットするようです。 、定義自体のを見てください。いくつかの単語でます:
バインディング、または動的結合、コンピュータプログラミング機構であります オブジェクト時に呼び出されるメソッドは、名前でルックアップされています 実行時に。
他のすべての答えは、単に「名前で検索する」である主なポイントを、欠場ます。
必要な解決策は、名前(または署名によって)正しいものを選択する関数又は二と共に、関数へのポインタのルックアップテーブルに非常に類似であろう。私たちは、「ハッシュテーブル」と呼んでます。