人々に使用してほしくない非推奨の関数のリンク時エラーを生成する最良の方法は、非推奨の関数がライブラリに存在しないことを確認することです。
おそらく、非推奨の関数を含む補助ライブラリを提供できます。注意を払わない嫌悪者は補助ライブラリとリンクできますが、主流の人々は補助ライブラリを使用しないため、関数を使用しません。ただし、まだ「非推奨」段階を超えています。
リンク時の警告を取得するのは難しいです。明らかに、GCC はいくつかの関数 (mktemp()
など) に対してそれを行います。Apple は、を使用するプログラムを実行すると GCC に警告を発しますgets()
。彼らがそれを実現するために何をしているのか、私にはわかりません。
コメントに照らして、リンク時または実行時まで待つのではなく、コンパイル時に問題を解決する必要があると思います。
GCC 属性には以下が含まれます (GCC 4.4.1 マニュアルより):
error ("message")
この属性が関数宣言で使用され、そのような関数の呼び出しがデッド コードの削除やその他の最適化によって削除されない場合、メッセージを含むエラーが診断されます。これは、extern char [(condition) ? 1 : -1]; トリック。関数を未定義のままにしてリンク障害を引き起こすことは可能ですが、この属性を使用すると、インライン関数が存在する場合やデバッグ情報を出力しない場合でも、問題が早期に診断され、呼び出しの正確な場所が示されます。
warning ("message")
この属性が関数宣言で使用され、そのような関数の呼び出しがデッド コードの削除またはその他の最適化によって削除されない場合、メッセージを含む警告が診断されます。これは、特に __builtin_constant_p およびインライン関数と一緒に、コンパイル時のチェックに役立ちます。.gnu.warning* セクションでメッセージを使用して関数を定義することは可能ですが、この属性を使用すると、インライン関数が存在する場合やデバッグ情報を出力しない場合でも、問題が早期に診断され、呼び出しの正確な場所が示されます。
構成プログラムがエラーを無視する場合、それらは単に壊れています。これは、関数を使用して新しいコードをコンパイルできなかったことを意味しますが、既存のコードは、ライブラリ内の非推奨の関数を (再コンパイルが必要になるまで) 引き続き使用できます。