なぜgccがローカル変数ではなく、グローバル変数のために使用されていない変数の誤差を与えますか?
質問
私は、GCCについての質問があります。変数は、一意のファイルにグローバルであるとき、私は、関数内でローカル変数を定義ではなくのに、なぜ私は未使用の変数のエラーが出る?ます。
私はそれが他の誰かのために使用することができますが、その後、私は右の外部ワードを配置する必要があることをやっていることを理解することができますか?
事前に感謝します。
解決
「ユニークなファイルのグローバル」による場合には、すべての関数の外側"int x;"
を意味し、それはそれを検出するために、コンパイラの仕事ではないですが、変数は、リンカに利用できるようにする必要があり、別のコンパイル単位がそれを必要とする場合には(のようなerrnoに)。
"static int x"
を意味している場合、、これはおそらく、GCCによって作られただけの選択肢です。私は、コンパイラはこれを通知するの必要のであり、それはあなたのアドレス空間内で数バイトを無駄以外の本当のダメージを与えていないとは思わない。
他のヒント
コンパイラは、グローバル変数が使用されているかどうかを知る方法がない - それは、例えば、完全に異なる言語で書かれたコンパイル単位から使用することができる
。グローバル変数は、コンパイラが知られていないことができ、他の場所で使用することができますので。外部ライブラリのOプログラム上のインスタンスのために。
未使用の地元の人々は、コンパイラによって決定することができます。彼らはオブジェクトファイル間で共有することができますので、未使用のグローバルのみ、リンカによって決定することができます。
一般的には、リンカはコード世代のための警告を行いません。
、コンパイラは、プロジェクト内のすべてのコンパイル単位を横切っていない完全な可視性を有します。リンカは、おそらくそれは、オブジェクトファイルから削除されます、それは未使用であることを伝えることが可能である。
それはグローバルだ場合、それが後にリンクされます、別のモジュールで使用することができますので。
これは、単一のファイルで定義されたすべてのグローバルを持っている一般的なイディオムです。このファイルもすべての変数を使用して任意のコードを、はるかに少ないコードを持っていない可能性があります。
私はandroid2.3でdalvikVMを構築するとき、私は同じ質問に遭遇したと私はポイントのキーを得ました。コンパイラのパラメータが厳しすぎるということだからです。
の LOCAL_CFLAGS + = -Werrorする。