18

文字どおりに解釈すれば理にかなっていますが、変数名の有効文字とは正確には何を意味するのでしょうか?

私は K&R を使用した C の初心者です。本からの直接の引用は次のとおりです。

「少なくとも内部名の最初の 31 文字は重要です。関数名と外部変数の場合、言語が制御できないアセンブラーとローダーで外部名が使用される可能性があるため、数は 31 未満である可能性があります。外部名の場合、標準では 6 文字と 1 つのケースのみが保証されます。」

ところで、「一件一件」とはどういう意味ですか?

4

5 に答える 5

21

通常、Single Case は「小文字」を意味します。「大文字」を意味する一部のOSを除きます。要点は、大文字と小文字が混在していると動作が保証されないということです。

abcdef

ABCDEF

場合のみ異なります。これは動作することが保証されていません。

「意味」の問題は、同じ文字がいくつあるかの 1 つです。

重要な文字が 6 つしかないとしましょう。

a_very_long_name

a_very_long_name_thats_too_similar

見た目は異なりますが、最初の 16 文字は同じです。有意なのは 6 つだけなので、それらは同じ変数です。

于 2009-12-30T16:11:10.650 に答える
7

それはあなたが恐れていることを意味します。外部名については、当時の C 標準 K&R 2nd ed. は、大文字と小文字を区別しない 6 文字しか与えません。afoobarしたがって、andaFooBazを独立したエンティティとして持つことはできません。

このばかげた制限 (レガシー リンカに対応するためのものであり、現在は廃止されています) は、どの環境にもあまり関係しなくなりました。C99 標準では、大文字と小文字を区別する外部名に 31 文字、内部に 63 文字が提供されており、実際に一般的に使用されるリンカーは、より長い名前をサポートしています。

于 2009-12-30T16:24:12.683 に答える
3

名前付きの2つの変数がある場合、

abcdefghijklmnopqrstuvwxyz78901A

abcdefghijklmnopqrstuvwxyz78901B

異なる個別の変数として扱われるという保証はありません...

于 2009-12-30T16:12:25.957 に答える
2

だということだ :

foobar1
foobar2

最初の 6 文字だけを考慮する必要があるため、同じ外部名である可能性があります。単一のケースは、大文字と小文字の名前を区別する必要がないことを意味します。

ほとんどすべての最新のリンカーは、はるかに長い名前を考慮することに注意してください。ただし、リンカーによっては制限があります。

于 2009-12-30T16:12:13.707 に答える
0

こんばんは

この制限されたシンボルの解決に関する問題の 1 つは、リンク時に発生します。

同じ名前の複数のシンボルが複数のライブラリに存在する可能性があり、リンカーは通常、探しているものと一致する最初に見つかったシンボルのみを取得します。

したがって、上記の S.Lott の例を使用すると、リンク エディターがシンボル "a_very_long_name" を検索し、その検索パス上にシンボル "a_very_long_name_thats_too_similar" を含むライブラリが見つかった場合、これが使用されます。これは、必要なシンボルを含むライブラリ、つまり "a_very_long_name" がコマンドで指定されている場合でも発生します。たとえば、ライブラリを次のように指定します。

-L/my/library/path -lmy_wrong_lib -lmy_correct_lib

リンク パス内の複数のシンボルを強制的に検索するコンパイラ オプション、またはより正確にはコンパイル時オプションがリンク エディターに渡されるようになりました。これらは通常、リンク時にエラーとして発生します。

さらに、gcc などの多くのコンパイラは、デフォルトでこのような動作をします。シンボルに対して複数の定義が見つかった場合に、リンク エディターが致命的なエラーを発生させずに続行できるようにするには、複数の定義を明示的に有効にする必要があります。

ところで、Clovis Tondo の本「 The C Answer Book 2nd ed. 」と併せて演習を行うことを強くお勧めします。

これを行うと、C が心に定着するのに非常に役立ちます。

HTH

乾杯、

于 2009-12-30T17:19:35.307 に答える