2016-08-01 7 views
0

私は、ヘッダーファイルで宣言された変数を使用しているCコードを削除する作業を進めています。私のコンパイラは何らかの理由でヘッダファイルからの未使用変数を警告しません。未使用の変数をヘッダファイルから呼び出すオプションは何ですか?それはCのファイルからそれを行います。ヘッダファイルから未使用の変数警告を取得するには?

+1

他のCファイルにはヘッダーが含まれている可能性があります。それらを取得したい場合は、一時的にCファイルに移動する必要があります。 – merlin2011

+4

ヘッダーファイルで変数を定義するのは、一般的に悪い方法です。*宣言することはできますが、定義するべきではありません。 *宣言されているだけで未使用の場合、コンパイラからの警告は通常ありません(何もしませんが、無料です)。本当に*変数を定義していますか?いくつか例を挙げることができますか? – tofro

+0

コンパイラが 'foo.h'を含むソースファイルを_all_で見ることができない限り、' foo.h'宣言されたオブジェクトが使用されていないかどうかを知ることはできません。リンカーの仕事のように聞こえる。 – chux

答えて

2

まず、コンパイラは、変数がヘッダファイルまたは.cファイルに宣言されているかどうかを認識していません。 - プリプロセッサが実行された後、これは区別できません。

ヘッダーファイルで通常宣言しているのは、外部参照、つまりストレージクラスexternalの変数です。そのような変数が使用されていないと警告するコンパイラはありません - システムヘッダファイルの多くがそのような変数を宣言していれば警告が表示されます(errnoまたはstderrが注目に値する例です。 errnoまたはstderrを使用しない任意のソースファイル

未使用のstatic変数および未使用の関数パラメータについて、コンパイラは警告を発行できます。そのような変数の使用法と適用範囲は、現在のコンパイル単位または関数に限定されており、「他に誰も使用できない可能性がある」ということを警告するのは理にかなっています。 extern変数は他のオブジェクトファイルでもよく使用できますが、コンパイラは警告を出すことができません。適切なリンカですが、外部のシンボルはオブジェクトファイルで使用されず、その変数を最終実行可能ファイル - コンパイルシステムで修正できるため、警告は必要ありません。

0

Cコンパイラでは、ヘッダ(インクルード)と他のCソースファイルとの間に違いはありません。

このデータは別のソフトウェアで使用される可能性があるため、コンパイラは未使用のグローバルデータについて警告メッセージを出す必要はありません。

単一オブジェクトファイルの範囲内でのみデータが使用されることが懸念される場合は、このデータ定義にキーワードstaticを追加して再構築し、ソフトウェアを実行してみてください。すべての機能が正常に動作していて、可能な(怠惰な)動的リンクが、削除したばかりのグローバルデータを失っていないことを確認していれば、削除することは本当に100%安全です。

+0

あなたの最後の提案はおそらく良い考えではありません:同じ '静的'定義( 'static'は*常に*定義)を持つ同じヘッダが15個のソースファイルに含まれている場合、同じ変数の15個のインスタンスがありますあなたのコードに広がっている - それをそのまま残しておくと( 'static'ではなく)、リンカーは複数の定義について不満を持ちます。提案は.cファイルでのみ意味があります。 – tofro

+0

2番目の考えでは、未使用の 'static'sの警告が表示されるので、実際にはその変数を使用しない場所を検出するのに役立ちます。 – tofro

+0

@tofroはい、あなたは正確に正しいです。私に+1を与えてください:) – sqrt163

関連する問題