gccについて質問です。関数で変数をローカルに定義すると、未使用の変数のエラーが発生するのに、変数が一意のファイルでグローバルである場合に発生しないのはなぜですか?.
他の誰かに使用できることは理解できますが、それを行うには、外部の単語を正しく配置する必要がありますか?
前もって感謝します。
コンパイラは、グローバル変数が使用されているかどうかを知る方法がありません。たとえば、まったく異なる言語で記述されたコンパイル ユニットから使用される可能性があります。
「一意のファイルでグローバル」と"int x;"
は、関数の外側を意味する場合、それを検出するのはコンパイラの仕事ではないため、別のコンパイルユニット(errnoなど)が必要な場合に備えて、リンカーが変数を使用できる必要があります。
リンカーで使用できない場所を意味する場合"static int x"
、これはおそらく GCC による選択にすぎません。コンパイラがこれを通知する必要があるとは思わず、アドレス空間で数バイトを浪費する以外に実際の損害はありません。
グローバル変数は、コンパイラが認識できない他の場所で使用できるためです。たとえば、外部ライブラリ o プログラムで。
未使用のローカルは、コンパイラによって決定されます。未使用のグローバルは、オブジェクト ファイル間で共有できるため、リンカーによってのみ決定できます。
通常、リンカーは code-gen に対して警告を行いません。
変数がグローバルの場合、コンパイラはプロジェクト内のすべてのコンパイル ユニットを完全に可視化できません。変数は別のコンパイル ユニットで変更される可能性があります。リンカは、それが未使用であることを認識できます。おそらく、オブジェクト ファイルから削除されます。
android2.3 で dalvikVM をビルドしたときに同じ質問に遭遇し、ポイントのキーを取得しました。これは、コンパイラのパラメータが厳しすぎるためです。
LOCAL_CFLAGS += -Werror .
グローバルの場合、後でリンクされる別のモジュールで使用できるためです。
すべてのグローバルを 1 つのファイルで定義するのは、一般的なイディオムです。そのファイルにはコードが含まれていない可能性があり、すべての変数を使用するコードははるかに少ない.