5

私はCで小さなAPIライブラリのようなモジュールを書いています。このモジュールをコンパイルして仲間の開発者に渡し、モジュールのヘッダーファイルでいくつかの必要な関数を公開して、モジュールを使用する開発者がどの関数を呼び出すかを認識できるようにします必要な機能について。ここで、1つだけ質問したいと思います。Cで必要な関数のみを公開できますか。

私はtest.cを持っています:

#include "test.h"
void A()
{
  if( some condition is true )
    B();
  else
   return;
}

void B()
{
  //some code here
}

test.hでは、公開されている関数は1つだけです。

void A();

これで、B()は明らかにA()に設定された条件に依存します。そうでない場合、実行できず、test.hでA()のみが公開されるため、ユーザーはB()を直接呼び出すこともできることを知りません。今、私の恐れは、ユーザーが私のモジュールにA()をバイパスすることによって直接呼び出すことができるB()と呼ばれる関数があることを知った場合(または推測によって)、それが私の実装を危険にさらす可能性があることです。

この場合、パブリックメソッドとプライベートメソッドがあるため、C ++の方が優れていることはわかっています。また、B()でA()のフラグチェックを使用することで、B()が直接呼び出されないようにすることもできますが、知りたいです。ユーザーがヘッダーファイルに公開されていない私の関数(B()など)を呼び出せないような他のメソッドがある場合。

4

2 に答える 2

11

関数を作成しますB

static void B(void)
{
  //some code here
}

その可視性は、それが定義されている翻訳単位に限定されます。B内部リンケージがあります。A外部リンケージがあります。

于 2012-11-01T09:22:19.790 に答える
6

一部の*NIXでgcc/clangによってのみサポートされる別の種類のリンケージは、「非表示」リンケージです。

次のように関数を定義できます。

__attribute__((visibility, ("hidden"))) void foo(void) {
      return;
}

これにより、共有オブジェクト内の別のポイントから関数を呼び出すことができますが、それ以外のポイントは呼び出せません。つまり、別の翻訳ユニットから呼び出すことはできますが、ライブラリを使用するアプリから呼び出すことはできません。

詳細については、http: //gcc.gnu.org/onlinedocs/gcc-4.4.1/gcc/Function-Attributes.htmlを参照してください。

于 2012-11-01T10:25:04.393 に答える