データまたは関数宣言で visibility 属性を使用して個々のシンボルの可視属性を明示的に設定することができます。
例:
int i __attribute__ ((visibility("default"))); void __attribute__ ((visibility("hidden"))) x () {...} extern void y() __attribute__ ((visibilty("protected"); |
visibility 宣言属性には、次の 5 つのキーワードを使用することができます:
visibility 宣言属性の値は、-fvisibility、-fpic、または -fno-common 属性のデフォルト設定よりも優先されます。
複数のシンボルで同じ visibility 属性を指定する場合、次の 5 つのコマンドライン・オプションのうち 1 つを使用して可視属性を設定することができます:
file は、可視属性を設定するシンボル名のリストを含むファイルのパス名です。 ファイル中のシンボル名は、余白 (ブランク、TAB 文字、または改行) で区切ります。 例えば、コマンドライン・オプションが次のような場合:
-fvisibility-protected=prot.txt
そして、ファイル prot.txt が次のような場合:
a b c d e |
シンボル a、b、c、d、および e の可視属性が protected に設定されます。 これは、各シンボルで次のように宣言した場合と同じです:
__attribute__ ((visibility=("protected")))
可視属性を明示的に設定するこれらの 2 つの方法 (宣言で __attribute((visibilty())) を使用する方法とファイルでシンボル名を指定する方法) は互いに排他的であり、両方を同時に行うことはできません。
次のコマンドライン・オプションの 1 つを使用してシンボルのデフォルトの可視属性を設定することができます:
このオプションは、可視属性リストファイルで指定がなく、宣言に __attribute__((visibilty())) がないシンボルの可視属性を設定します。例えば、コマンドライン・オプションが次のような場合:
-fvisibility=protected -fvisibility-default=prot.txt
そして、ファイル prot.txt の内容が前の例と同じ場合、a、b、c、d、および e を除くグローバル・シンボルの可視属性が protected に設定されます。 しかし、これらの 5 つのシンボルの可視属性は default に設定されプリエンプト可能になります。