非推奨の警告を実装する 1 つの方法は、非推奨のコンテキストから呼び出している場合を除き、非推奨の関数の呼び出しで警告を生成することです。このようにして、レガシー コードは、ノイズになるだけの警告を生成することなく、レガシー コードを呼び出すことができます。
これは妥当な考え方であり、OS X の GCC 4.2 (1) と Clang 4.0 (2)、および Ubuntu の Clang 3.0 (3) に見られる実装に反映されています。
- (1): i686-apple-darwin11-llvm-g++-4.2 (GCC) 4.2.1 (Apple Inc. ビルド 5658 に基づく) (LLVM ビルド 2336.11.00)
- (2): Apple clang バージョン 4.0 (tags/Apple/clang-421.0.57) (LLVM 3.1svn ベース)
- (3): Ubuntu clang バージョン 3.0-6ubuntu3 (tags/RELEASE_30/final) (LLVM 3.0 ベース)
ただし、Ubuntu で GCC 4.6 (4) を使用してコンパイルすると、コンテキストに関係なく、非推奨の関数のすべての呼び出しに対して非推奨の警告が表示されます。これは機能の低下ですか? 他の動作を得るために使用できるコンパイラ オプションはありますか?
- (4): g++ (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3
プログラム例:
int __attribute__((deprecated)) a() {
return 10;
}
int __attribute__((deprecated)) b() {
return a() * 2; //< I want to get rid of warnings from this line
}
int main() {
return b(); //< I expect a warning on this line only
}
GCC 4.2 からの出力 (はい、同じ警告が 2 回表示されますが、気にしません):
main.cpp: In function ‘int main()’:
main.cpp:10: warning: ‘b’ is deprecated (declared at main.cpp:5)
main.cpp:10: warning: ‘b’ is deprecated (declared at main.cpp:5)
GCC 4.6 からの出力:
main.cpp: In function 'int b()':
main.cpp:6:9: warning: 'int a()' is deprecated (declared at main.cpp:1) [-Wdeprecated-declarations]
main.cpp:6:11: warning: 'int a()' is deprecated (declared at main.cpp:1) [-Wdeprecated-declarations]
main.cpp: In function 'int main()':
main.cpp:10:9: warning: 'int b()' is deprecated (declared at main.cpp:5) [-Wdeprecated-declarations]
main.cpp:10:11: warning: 'int b()' is deprecated (declared at main.cpp:5) [-Wdeprecated-declarations]
GCC 4.2 と同じ出力が得られることを GCC 4.6 に納得させるにはどうすればよいですか?