43

非推奨の警告を実装する 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 に納得させるにはどうすればよいですか?

4

4 に答える 4

53

gcc 4.6は、この問題の解決に役立つ診断プラグマを追加しました。

#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wdeprecated-declarations"
int __attribute__((deprecated)) b() {
   return a() * 2; //< I want to get rid of warnings from this line
}
#pragma GCC diagnostic pop

注:これはgcc4.6以降でのみ機能します。およびpushpop4.6拡張です。gcc 4.5では、#pragma GCC diagnostic pushpopは無視されます(警告付き)。無視されないのは#pragma GCC diagnostic ignored "-Wdeprecated-declarations"-ですが、これはファイルの終わりまで有効です。

于 2012-11-19T18:33:10.237 に答える
53

-Wno-deprecated非推奨の警告をすべて削除します

于 2012-11-19T18:14:05.937 に答える
19

GCC 4.2で見られる動作は、GCCに対するApple固有のパッチが原因です。FSF GCC 4.2.4は、の使用について警告しますa。AppleGCCがFSFGCCに持っていない特定のビットは、次のとおりです。

--- a/gcc/toplev.c
+++ b/gcc/toplev.c
@@ -902,6 +902,9 @@ warn_deprecated_use (tree node)
   if (node == 0 || !warn_deprecated_decl)
     return;

+  if (current_function_decl && TREE_DEPRECATED (current_function_decl))
+    return;
+
   if (DECL_P (node))
     {
       expanded_location xloc = expand_location (DECL_SOURCE_LOCATION (node));

(GPLv2以降で利用可能)

このパッチを新しいバージョンのGCCに適合させ(おそらく変更は不要で、おそらく大きな変更が必要です)、このパッチを適用してソースからGCCをビルドすることをお勧めします。または、これをFSFGCCbugzillaの機能リクエストとして報告することもできます。

于 2012-11-19T20:04:24.887 に答える
1

同じ問題が発生します。思いついた解決策は次のとおりです

typedef OLD_A_NOT_TO_BE_USED a __attribute__((deprecated));

int OLD_A_NOT_TO_BE_USED () {
    return 10;
}

int __attribute__((deprecated)) b() {
    return OLD_A_NOT_TO_BE_USED () * 2; //< I want to get rid of warnings from this line
}

int main() {
    return b(); //< I expect a warning on this line only
}

したがって、クラスの名前を OLD_A_NOT_TO_BE_USED クラスに変更するだけです。return b(); でのみ警告が表示されます。誰かが を使用していた場合でも、非推奨の警告が表示されます。

于 2015-01-27T20:09:56.543 に答える