2012-04-01 3 views
3

は、私は(つまり、アクセス指定子と呼ばれているかどうかわからない)Cでアクセス指定子を実装するにはどうすればよいですか?

目的は(関数func2)のみ(関数func1内)一つの場所で呼び出し可能な関数を作ることであるアクセス指定子を実装しようとしていました。

int func1() 
{ 
    // Make func2 callable only here` 
#define FUNC2_CALLABLE 
    func2(); 
#undef FUNC2_CALLABLE 
} 

#ifdef FUNC2_CALLABLE 
int func2() 
{ 
    return 1; 
} 
#endif // FUNC2_CALLABLE 

func2はfunc1からのみ呼び出し可能で、コード内の他の場所から呼び出すことはできません。

上記のコードが目的を果たしていますか?このよう

int func2() 
{ 
#ifdef FUNC2_CALLABLE 
return 1; 
#endif 
} 

この作品はウィルそれをやっについての任意の代替提案をどのように

<編集1>

? < /編集1>

+0

このようには機能しません。あなたができることは、それをエクスポートすることではなく、fun2()をfunc2()で静的宣言すると、リンカーには見えず、このコンパイルユニットの外で呼び出すこともできません。 – pizza

+3

http://stackoverflow.com/questions/1401781/how-to-implement-a-private-restricted-function-in-c – Flot2011

+2

これは1か所で呼び出し可能なだけで、他の人ができるようにしたくない場合それを呼び出す - なぜそれを機能させるのか?どうしてfunc1()にコードを直接記述しないのですか? –

答えて

1

これにより、func2のリンカエラーが見つかりません(func2は使用すると定義されません)。

私はあなたがの静的を探しているかもしれないと思います。

static int fake(int x) { return x * 2; } 

int doSomething(int x) { int tmp = fake(x); doOtherThings(); } 

偽のコンパイル単位(基本的にファイル)の外に存在しないであろう。

関数が他の関数からのみ呼び出されるようにすることはあまり意味がありません。それがあなたの最終目標ならば、コードをインライン化してください。

+0

コードの小さな塊であっても、インラインコードを入れても大丈夫でしたが、これを複数のインスタンスで使用する必要がある場合はどうすればいいですか? – Bleamer

+0

@Bleamerこの場合、あなたは静的関数を使用して立ち往生しています。それはコンパイル単位に制限されますが、実際にはwallykの答えはより良い選択肢です。これにより、機能の範囲がさらに制限されます。実際には、関数がコンパイル単位を離れない限り、何も心配するべきではありません。あなたがそれ以上隠す必要があるいくつかの特別な理由はありますか? (Chris Lutzの提案も非常に興味深い - 関数の宣言の範囲を特に限定することができる) – Corbin

+0

私が扱っている従来のソースコードは、低レベルのAPIへの任意の呼び出しで満ちているため、私の考えは、これらの機能を順番に呼び出さないようにすることでした。 ご協力いただきありがとうございます。 – Bleamer

0

実際の方法はありません。

static int func2() 
{ 
    return 1; 
} 

int func1() 
{ 
    func2(); 
} 

(end of file) 
+0

技術的には、どこでも '#define func2()$&@ * ^%|'のようなことをしたら、どこでも 'func2()'を定義することができます。 " –

+0

@ChrisLutz:面白いアプローチ。私は次の時間に私の鞄の中にそれを捨て去り、同様のことが問題であるかどうかを知る必要があります。 – wallyk

0

たぶん、あなたはstaticキーワードを使用することができます。標準のCで行うことができる最高のfunc2のは、静的にすると、ソースファイルの下に、それが近い定義することです。

しかし、staticの機能は、同じファイル内のすべてのコードからアクセスできます。他のファイルはアクセスできません。

+0

"メソッド"と "メンバー"はC言語では役に立たない言葉です。私はあなたが何を意味しているか知っていますが、OOをネイティブにサポートしていない言語でOO用語で混乱するのは簡単です。 –

+0

@ChrisLutz良いアドバイス、それらを変更しました – llj098