2012-05-25 16 views
5

私が一般的にCOMルールに従いますが、MIDLコンパイルを実行せず他のものを対象にしないので、 c/C++よりも多くの言語をサポートします。このように、私はいつも私のニーズに合わせてルールを曲げることができると知っていますが、いつか本当にCOMに準拠したいと思うかもしれないので、私はしないようにしています。COMインターフェイスでメソッドの廃止予定警告を生成する方法(C++)

誰かが特定のインターフェイスの特定のメソッドを使用してコードをコンパイルすると、警告を表示したいと思います。 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)を使用することについて私が知らない制限がありますか?

おかげで再び

答えて

6

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

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

+0

純粋仮想メソッドである非推奨のインターフェイスメソッドを宣言するヘッダーファイルで '__declspec(deprecated)'を使用しようとすると、そのメソッドを使用するコードをコンパイルするときに警告が表示されません。しかし、 '#pragma deprecated'マクロを使用すると警告が表示されます。これは何もないより優れていますが、マクロの使用法は__declspecの場合よりも正確ではありません。カスタム警告メッセージを指定できるからです。また、 '#pragma deprecated'マクロは、インタフェースからではなくても、myメソッドの名前を持つ識別子を対象とします。なぜこのようなことが起こったのか考えていますか? – franmon

+0

あなたの答えに感謝します。あなたの説明がとても良いので、 '__declspec(廃止予定)'ディレクティブを使用できるようにするために私が何ができるかについて他の誰かが私に解決策を与えていなければ、それを勝利としてマークします。 – franmon

+0

@franmon:あなたのコールサイトコードは表示されません。静的型Interface *(またはInterface&)のオブジェクトのメソッドを呼び出していますか? – ndkrempel

関連する問題