2013-02-17 7 views
10

関数のCでstaticキーワードを使用すると、その関数が定義されているコンパイル単位に関数が制限されることが分かります。私は今シンボルの可視性を検討していますが、の機能と機能の差異については、__attribute__((visibility("hidden")))と表示されているか、-fvisibility=hiddenコマンドラインオプションを使用しています。静的関数と "hidden"可視属性を持つ関数の実際的な違いは何ですか?

私は、このような変化がまったく同じではないという気持ちがあるのですが、実際のコードでそれらを扱うときの違いやその意味を理解していません。両者の間では何が変わりますか。また、どちらを使いたいでしょうか? __attribute__((visibility("hidden")))

答えて

12

機能は、それを含む共有ライブラリ外見えないが、そのライブラリーは、このような機能fhidfoo.cで定義され、bar.cから呼び出すことができfoo.pic.obar.pic.oを連結することにより行われた場合。もちろん、外部のコード(例えば、メインプログラムや他の共有ライブラリから)は呼び出すことができません。fhid

隠された可視性は、それを構成する個々のコンパイル単位には適用されません。これとは対照的に

、それは(それは悪趣味で、読みやすさの理由のために避けなければならない場合でも)static void fsta(void)関数を定義するfoo.c可能だっただろう、とbar.cに異なるstatic void fsta(void)関数を定義します。

また、原則として、static関数をより簡単にインライン化することもできますし、コンパイラは異なる呼び出し規約を使用することもできます。

+0

しかし、+1 –

0

隠し可視性がシンボル はダイナミックシンボルテーブルに配置されないので、他の「モジュール」 (実行可能ファイルまたは共有ライブラリ)を直接参照することができないことを示しています。

http://ohse.de/uwe/articles/gcc-attributes.html

私が追加することができます:あなたはstaticのCのバージョンに近い意味を持つC++で__attribute__((visibility("hidden")))を使用することができます。

+0

正確に言えば、2つの異なるコンパイル単位で同じ名前の2つの異なる静的関数を持つことができます。隠された可視性を持つ2つの関数 'f'を持つことはできません –

4

あなたが唯一の共有ライブラリの文脈の中ではなく、共有ライブラリの外で使用することにしたいと思い、共有ライブラリでglobal機能を持っている場合 - あなたは例えば__attribute__((visiblity("hidden")))

が必要になります。

あなたは

として機能させることができます void foo()Foo.cで定義された機能を持っており、あなたはそれが Bar.cFooBarBaz.dll(またはFooBarBaz.so)を生成するコンパイル単位です Baz.cから参照したいと思います場合は

覚えておいて、foo()は、dll(または。soファイル) これを読んでpaper

関連する問題