2

私はライブラリを書いています。foo1 と foo2 という 2 つの重要な関数があるとします。これらの関数は両方とも、3 番目の関数 foo0 を呼び出します。ただし、ライブラリがコンパイルされてリンクされた後に foo0 が使用されることは意図されていません。ライブラリのユーザーが foo0 を利用できないようにする方法はありますか?

ユーザーが関数を利用できるようにしたいというのは、私にとって神聖なことかもしれませんが、それはよりクリーンなライブラリになると思います。そして、これを行う API を使用したことがあると確信しています。

フォローアップの質問: 可能であれば、2 つの異なるヘッダー ファイルを作成しますか? ライブラリのコンパイルに使用するものと、ユーザーが必要とする typedef、enum、プロトタイプなどのみを含むものはありますか?

ありがとう!

4

2 に答える 2

0

これを実行するための最も移植性の高い方法は、ビルド時に関数名をランダム化し、プリプロセッサ マクロを使用してソース ファイルに固定名を公開することですが、パブリック ヘッダーには公開しません。関数名が説明的ではなく、ビルドごとに変わる場合、誰もそれを使用しようとしません。

于 2013-03-29T16:37:07.797 に答える
0

C 標準は、複数の翻訳単位にわたってこれを行う手段を提供していません。一部のリンカーは、これを支援する手段を提供します。一部のリンカーを使用すると、オブジェクト モジュールによって発行された名前から一部の名前を除外するようにリンカーに指示しながら、複数のオブジェクト モジュールをリンクして、結合されたオブジェクト モジュールを生成できます。結合されたオブジェクト モジュールを生成するためのリンク中に、入力オブジェクト モジュールの 1 つで使用され、別の入力オブジェクト モジュールで定義されている名前が解決されるため、それらを外部から表示する必要がなくなります。

さらに支援を受けるには、使用している開発者ツールを指定する必要があります。

于 2013-03-29T13:37:36.463 に答える