関数に関するスプリント警告への対処“未使用”それらはパラメーターとして渡されますが
質問
私のプログラムでは、 splint チェッカーが警告します:
expat-test.c:23:1: Function exported but not used outside expat-test: start
A declaration is exported, but not used outside this module. Declaration can
use static qualifier. (Use -exportlocal to inhibit warning)
expat-test.c:38:1: Definition of start
start()関数 が使用されます。プログラムは、コールバックで機能する expat XMLパーサーを使用します。パーサーに機能を与えます:
XML_SetElementHandler(parser, start, end);
そしてパーサーはいくつかのポイントでそれをコールバックします。これはCの非常に一般的なイディオムであり、スプリントが文句を言うのはなぜかと思います。 FAQ またはマニュアル。
解決
start()
が定義されているのと同じ翻訳単位(通常は.cソースファイル)で XML_SetElementHandler()
を呼び出しますか?その場合、警告は正しい可能性があります。関数定義に static
を追加し、アプリケーションがエラーなしでリンクしているかどうかを確認します。
他のヒント
'static'キーワードは、他の翻訳単位(通常は.Cファイル)から関数の名前を効果的に隠します。コードはまだそこにあり、そのCファイルから関数のアドレスを取得できます(他のCファイルからは取得できません)。その後、関数を呼び出すか、関数からアドレスを返すか、グローバル変数などに保存することにより、他の変換ユニットにアドレスを渡すことができます。
静的としてエクスポートされないすべての関数を宣言する傾向があります。私は教えられてきましたが、そうすることは良い習慣であると現在信じています。 (免責事項:ほとんどの場合と同様に、この「ルール」には多数の例外があります。)
所属していません StackOverflow