5

我们在我工作的地方使用“类 COM”模型,因为我们通常遵循 COM 规则,但不执行 MIDL 编译,也不针对 c/c++ 以外的其他语言。因此,我知道我总是可以根据自己的需要改变规则,但我尽量不要这样做,因为我们可能希望有一天真正符合 COM 标准,如果那一天到来,我们希望它尽可能轻松。

当有人从特定接口使用特定方法编译代码时,我想打印出警告。在 c++ 中(我们只支持微软编译器),我们会__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 回答