2

コンパイルしている抽象クラスが仮想デストラクタを必要としないことを gcc に伝える方法はありますか (COM オブジェクトには決してありません)。たとえば、nsISupports は常に仮想デストラクタの欠落について文句を言います。この警告が必要な場合、COM に似ていないクラスがある可能性があるため、警告をオフにしても役に立ちません。

そのため __attribute__((com_interface)) は廃止され、vtable レイアウトのみが変更されました。このクラスに欠落しているデストラクタについて警告されたくないことをコンパイラに伝えることができる別の __attribute__ はありますか?

4

3 に答える 3

1

仮想 dtor の欠落に関する警告が表示されるのには理由があります。主な理由は、特に大規模で複雑なコード ベースでは、追跡するのがデバッグの悪夢だから
です。これを行うには非常に具体的な理由があるかもしれませんが、クラスがリファクタリングされるとどうなるかを自問してください。後で使用法が変わるようなものですか?

于 2009-06-20T12:56:41.450 に答える
1

この警告を無効にすることを再検討する必要があると思います。それには理由があります。現在、クラスに仮想デストラクタを配置しないことは正しいかもしれませんが、クラスが将来どのように使用されるかを正確に予測することはできません。

クラスの使用方法を少し変更すると、次の開発者がリソース リークを突き止めようとして何時間も頭を悩ませてしまう可能性があります。その人に好意を持って、デストラクタを今すぐ仮想化してください。

また、あなたは自分自身に尋ねたいと思うかもしれません

非仮想にすることで得られるもの

抽象クラスがあると述べたので、少なくとも1つの仮想関数があると思います。したがって、デストラクタを仮想にしても、オブジェクトに v テーブルは追加されません。別のメンバを含めるように拡張するだけです。

これを非仮想化しても、実際の利益は見られません。問題のみ。

于 2009-06-20T14:57:14.263 に答える
0

おそらく、一対の診断プラグマを使用したいと思うでしょう。これに失敗すると、特定のファイル内のすべての警告が#pragma GCC system_header無効になります。

于 2009-06-20T12:38:57.007 に答える