【问题标题】:How to generate deprecated warning for a method in a COM interface (c++)如何为 COM 接口 (c++) 中的方法生成不推荐使用的警告
【发布时间】:2012-05-25 23:41:34
【问题描述】:

我们在我工作的地方使用“类 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) 与纯虚拟方法一起使用是否有我不知道的限制?

再次感谢

【问题讨论】:

    标签: c++ visual-studio-2010 com deprecated


    【解决方案1】:

    __declspec(deprecated) 是 MS C/C++ 编译器的源代码级功能,不会影响任何东西的二进制布局 (ABI) - 因此用户不必重新编译。效果是通过包含您的 C++ 头文件向调用该方法的任何人发出编译时警告。它不会影响人们将您的对象用作 COM 对象而不包括您的标头,例如从另一种语言。我不相信 COM/IDL 本身提供了类似的“已弃用”属性。

    因此,总而言之,为了 C++ 用户的利益,您最好添加该属性,但如果您曾经为一般 COM 消费者提供过,他们将不得不依赖您提供的文档来知道该方法已被弃用。

    【讨论】:

    • 当我尝试在头文件中使用__declspec(deprecated) 来声明我要弃用的接口方法(这是一个纯虚方法)时,在编译使用该方法的代码时没有收到任何警告。但是,如果我使用 #pragma deprecated 宏,我会收到警告。这总比没有好,但宏的使用不如 __declspec 精确,因为我可以指定自定义警告消息。此外,#pragma deprecated 宏将针对具有我的方法名称的任何标识符,即使不是来自接口。您对为什么会发生这种情况有任何想法吗?
    • 感谢您的回答。如果没有其他人给我一个解决方案来说明我可以做些什么来使用__declspec(deprecated) 指令,我会将其标记为获胜者,因为您的解释非常好。
    • @franmon:您没有显示您的呼叫站点代码。您是在静态类型 Interface*(或 Interface&)的对象上调用该方法吗?
    • 我执行以下操作:Interface* pI = NULL; CoCreateInstance(GUID, args..., &pI); 创建一个继承自 Interface 的 Class 类的对象,然后是 pI->OldMethod(x1,x2);
    • 明天我会在工作中检查 CoCreateInstance 和 OldMethod 调用之间是否有任何东西......比如 QueryInterface 调用或其他东西。但我不这么认为。重要吗?
    猜你喜欢
    • 2015-10-26
    • 1970-01-01
    • 2014-04-27
    • 2017-05-22
    • 1970-01-01
    • 2020-01-31
    • 2013-02-14
    • 2017-05-18
    • 1970-01-01
    相关资源
    最近更新 更多