プログラミング言語、特にC、C++、D などのコンパイルされた言語では、リンケージは、プログラム全体または単一の翻訳単位全体で名前が同じエンティティを参照できるかどうかを説明します。
キーワードstaticは、C で関数または変数の可視性をその翻訳単位に制限するために使用されます。これは C++ でも有効です。(C++ 98/03 では、匿名名前空間を優先してこの使用法が非推奨になりましたが、C++ 11 では非推奨ではなくなりました。) また、C++ では、C とは異なり、
const明示的に宣言されない限り、名前空間スコープの変数は暗黙的に内部リンケージを持つものとして扱われます。extern
名前のリンケージは、そのスコープと関連していますが、スコープとは異なります。名前のスコープとは、名前が可視となる翻訳単位の一部です。たとえば、グローバル スコープ (C のファイル スコープと同じ、C++ のグローバル名前空間スコープと同じ) を持つ名前は、ファイルのどの部分でも可視です。その名前に外部リンケージまたは内部リンケージが与えられているかどうかに関係なく、そのスコープは翻訳単位の終了時に終了します。
名前に外部リンケージがある場合、その名前が示すエンティティは、同じ名前の別の宣言を使用して別の翻訳単位から参照される可能性があり、また、別の宣言を使用して同じ翻訳単位内の他のスコープから参照される可能性もあります。名前に内部リンケージが与えられている場合、そのような宣言は同じ名前を使用していても別のエンティティを示しますが、そのエンティティは同じ翻訳単位内の別の宣言によって参照できます。リンケージがまったくない名前は、異なるスコープの宣言から参照することはできません。同じ翻訳単位内からでも参照できません。このような名前の例としては、関数のパラメーターやローカル変数があります。詳細は、C (リンケージがあるのはオブジェクトと関数のみで、型にはリンケージがありません) と C++ の間、およびこの簡略化された概要の間で異なります。
言語によって外部シンボルの装飾方法が異なるため、言語間のリンクは慎重に行う必要があります。C extern "C"++ と C のコードをリンクするには、一般的な慣用句が使用されます。
C言語でのリンケージ
ISO/IEC 9899:TC3 (C99 標準) から引用した「リンケージ」の定義。C では「識別子」という用語が使用されていますが、この記事では「名前」という用語が使用されています (後者は C++ がリンケージを形式化するために使用するものです)。
異なるスコープ内または同じスコープ内で複数回宣言された識別子は、リンケージと呼ばれるプロセスによって同じオブジェクトまたは関数を参照することができます。[1]
以下はリンクの一般的な例です。
/* ファイル demo1.c */
/* extern */ void foo ( void ); /* extern オプション - デフォルト */ int main ( void ) { foo (); return 0 ; }
/* ファイル demo2.c */
void foo ( void ) { ... }
関数はfoo2 つのファイルで宣言され、その関数本体は で定義されていますdemo2.c。 リンケージにより、内部fooで呼び出された は内のを参照します。これは、関数の外部リンケージの例です。
main()demo1.cfoodemo2.c
参照
参考文献
- ^ ISO/IEC 9899。技術的な正誤表と根拠を含む公式 C99 ドキュメント。2007 年現在、この標準の最新バージョンは「ISO/IEC 9899:TC3」(PDF)です。 (3.61 MiB )
