5

通常、COM ルールに従っていますが、MIDL コンパイルを実行せず、c/c++ 以外の言語を対象としないため、私が働いている場所では「COM のような」モデルを使用しています。そのため、いつでも自分のニーズに合わせてルールを曲げることができることはわかっていますが、いつの日か本当に COM 準拠になりたいと思うかもしれません。

誰かが特定のインターフェイスから特定のメソッドを使用してコードをコンパイルしたときに、警告を出力したいと考えています。C++ (Microsoft コンパイラのみをサポート) では、__declspec(deprecated)目的を達成するために関数宣言の前に追加します。

これをインターフェイス メソッド宣言の前に追加することはできますか?それとも、それを行うためのより良い、より多くの COM 方法がありますか?

また、メソッドの前に追加するだけ__declspec(deprecated)で、ユーザーに再コンパイルを強制するのに十分かどうかも知りたいです (可能であれば、それを避けたいです)。

ありがとう

アップデート

__declspec(deprecated)次のようにメソッド宣言の前で使用してみました:

struct Interface : public IUnknown
{
    __declspec(deprecated) virtual HRESULT __stdcall OldMethod
    (
        int Arg1;
        int Arg2;
    ) = 0;

    virtual HRESULT __stdcall NewMethod
    (
        //arguments...
    ) = 0;
}

メソッドを非推奨にするこの方法では、OldMethod を使用しようとしても、コンパイラの警告はまったく表示されません。__declspec(deprecated)純粋仮想メソッドでの使用について、私が知らない制限はありますか?

再度、感謝します

4

1 に答える 1

6

__declspec(deprecated)MS C/C++ コンパイラのソース レベルの機能であり、バイナリ レイアウト (ABI) には何の影響も与えないため、ユーザーは再コンパイルする必要がありません。その効果は、C++ ヘッダー ファイルをインクルードすることによってそのメソッドを呼び出すすべての人にコンパイル時の警告を発行することです。たとえば、別の言語から、ヘッダーを含めずにオブジェクトを COM オブジェクトとして使用している人々には影響しません。COM/IDL が類似の「非推奨」属性自体を提供しているとは思えません。

したがって、要約すると、C++ ユーザーの利益のために属性を追加することもできますが、一般的な COM コンシューマーに提供する場合、提供するドキュメントに依存して、メソッドが非推奨であることを知る必要があります。

于 2012-05-25T23:47:48.737 に答える