27

Cの本では、次のように述べています。

内部名の少なくとも最初の31文字は重要です。関数名と外部変数の場合、言語が制御できないアセンブラーとローダーによって外部名が使用される可能性があるため、この数は31未満になる可能性があります。外部名の場合、標準では6文字と1つのケースに対してのみ一意性が保証されます。if、else、int、floatなどのキーワードは予約されています。変数名として使用することはできません。それらは小文字でなければなりません。

誰かが「内部名」、「外部名」、「外部変数」とは何かを説明できますか?例を挙げていただければ幸いです。

4

4 に答える 4

36

白ひげを撫でながら、賢く尊大な声で言います。

FORTRAN と COBOL がコンピューティングの世界を支配していた昔、新興言語の C は既存のツール チェーンに適合する必要がありました。これらのツール チェーンには、短い 6 文字のシンボル (変数と関数) 名のみを処理するリンカー (別名リンカー、別名ローダー) とアセンブラーが含まれていました。

これらのツール チェーンの C コンパイラは、リンカーが使用するオブジェクト ファイルを書き出すときに、変数名と関数名が短いふりをする必要がありました。それは悪いニュースでした。幸いなことに、C プログラム内には、オブジェクト ファイルに表示する必要のないシンボルがたくさんあります。

たとえば、関数の名前...「main」や「sqrt」などは、オブジェクトモジュールに表示される必要があるため、他のオブジェクトモジュールのコードでそれらを使用できます。「extern」スタイルのグローバル変数の名前も同様です。これらは外部名です。

しかし、C プログラム内の他のすべての名前 (たとえば、関数のスコープ内の変数の名前、構造体のメンバーの名前など) は、オブジェクト モジュールにする必要はありませんでした。それらは「内部名」と呼ばれます。

したがって、たとえば、関数内にこれらの C 変数を含めることができます。

 int myFavoriteItem;
 int myFavoriteThing;

それでいいでしょう。ただし、次のように外部変数として宣言することもできます。

 extern int myFavoriteItem;
 extern int myFavoriteThing;

システムによっては、これらの名前を 6 文字の長さであるかのようにオブジェクト ファイルに書き出すものがあります (オブジェクト ファイルは長い名前をどう処理すればよいかわからなかったからです)。次に、このように宣言されているかのように、オブジェクト ファイルを調べます。

 extern int myFavo;
 extern int myFavo;

それらは重複した宣言になります。C コンパイラは、重複した宣言をオブジェクト ファイルに書き込むのではなく、この種のものをキャッチしてエラーをスローする必要がありました。これはプログラマにとって大きな助けとなりました。オブジェクト ファイル内の宣言が重複していると、リンカー エラー メッセージが非常に不明瞭になりました。

あなたが引用した一節は、コンパイラが内部名の少なくとも31文字と外部名の6文字を認識しなければならないと指定しています。最新のコンパイラとツールチェーンには、異なる名前の長さの制限がなくなりました。

于 2012-10-19T17:06:21.467 に答える
4

外部名:

「外部」名は、「extern」キーワードで宣言された非静的関数や変数など、他のコンパイル単位から見えるものです。これらの名前は、リンカーとローダーに公開する必要があります。Ye Olden Days では、一部のリンカーとローダーは非常に短い名前しか処理できませんでした。

内部名:

「内部」名は、コンパイルされているモジュールの外部で可視化されないものです。基本的に「静的」スコープを持つもの、または関数に対してローカルなものです。Cコンパイラはこれらの名前を処理する必要がありますが、それ以外は処理しません

于 2016-07-28T07:15:42.580 に答える
1

「内部名」は、関数内の識別子の名前です (実質的にローカル変数名)。

「外部名」は、関数の名前と、グローバル スコープで宣言された識別子またはストレージ クラス extern で宣言された識別子を含む、他の識別子の名前になります。

基本的に、「外部から見える」必要があるものはすべて、6 つの (大文字と小文字を区別しない) 一意の文字を持つことが保証されているだけであり、これは非常に制限的です。

実際には、これはもはや問題ではありません。C99 ではこれらの制限が引き上げられ、最新のコンパイラのほとんどはこれらの制限を廃止するか大幅に引き上げています。たとえば、Visual C++ では、Cをコンパイルするときに、すべての識別子 (内部または外部) を一意にするために 247 文字を使用できます。

于 2012-10-19T16:52:13.543 に答える
0

外部名は、外部リンケージを持つ識別子です。識別子が外部リンケージを持つためには、ファイルスコープの非静的であるか、特に「extern」と宣言されている必要があります。例:

int global_variable;

int main(void)
{
    int local_variable;
    extern int extern_variable;
    return 0;
}

上記の例では、識別子global_variableextern_variableは外部名です。local_variable内部名です。

実際には、重要な文字の量は31と6よりも多いことに注意してください。たとえば、MicrosoftのCコンパイラは、デフォルトで内部名と外部名の両方に247の重要な文字を使用します。GCCは、内部名のすべての文字を重要なものとして扱います。外部名の重要な文字はリンカーによって異なります(ほとんどのプラットフォームでは、内部名と同じ規則が適用されます。すべての文字が重要です)。

ANSI規格は、実装が規格に準拠するための重要な文字の最小数を示しているだけです。

于 2012-10-19T17:08:43.483 に答える