Cリンク属性

1501 ワード

--<>--プログラムを構成する各ソースファイルがそれぞれコンパイルされた後、すべてのターゲットファイルと1つ以上の関数ライブラリから参照される関数がリンクされて実行可能プログラムが形成されますが、同じ識別子がいくつかの異なるソースファイルに表示された場合、同じエンティティを表しますか、それとも異なるエンティティを表しますか.識別子のリンク属性は、異なるファイルに現れる識別子をどのように処理するかを決定し、識別子の役割ドメインはそのリンク属性に関係するが、この2つの属性は異なる.リンクプロパティには、external(外部)、internal(内部)、none(なし)の3種類があります.リンク属性を持たない識別子(none)は、常に個別の個体とされ、すなわち、識別子を変更する複数の宣言は、独立した異なるエンティティがinternalリンク属性に属する識別子とされ、同じソースファイル内のすべての宣言で同じエンティティを指すが、異なるソースファイルにある複数の宣言は異なるエンティティに属する.externalリンク属性に属する識別子は、何度宣言されても、いくつかのソースファイル内にある同じエンティティを表す.1 ----> typedef char *a; 2 ----> int b; 3 ----> int c (4 -----> int d) { 5 -----> int e; 6 -----> int f (7 ---->int g) }上図のように、デフォルトでは、識別子b,c,fのリンク属性はexternalであり、残りの識別子のリンク属性はnoneであるため、別のソースファイルにも識別子bの類似宣言が含まれ、関数cが呼び出されると、実際にはこのソースファイルで定義されたエンティティにアクセスし、fのリンク属性のすべてがexternalであるのは関数名であるため、このソースファイルで関数fを呼び出すと、実際には他のソースファイルで定義された関数にリンクされ、この関数定義が関数ライブラリに表示される可能性があります.
externおよびstaticキーワードexternおよびstaticは、宣言において識別子のリンク属性を変更するために使用され、ある宣言が通常externalリンク属性を有し、その前にstaticキーワードを加えると、そのリンク属性をinternalに変更することができ、例えば、2番目の宣言がstatic int bと書かれている場合、変数bはこのソースファイルにプライベートとなり、関数をstaticとして宣言することもできます.次のstatic int c ( int d )では、他のソースファイルに呼び出されないようにします.
staticは、デフォルトのリンク属性がexternalであるという宣言だけがリンク属性を変更する効果があります.
externキーワード規則は一般的に、識別子にexternalリンク属性を指定します.これにより、他の任意の場所で定義されたエンティティにアクセスできます.関数の識別子にexternalリンク属性を指定します.これにより、関数は他のソースファイルで宣言された外部変数static int i; int func() { int j; extern int k; extern int i; }にアクセスできます.