【问题标题】:how to avoid naming conflict with VSConstants.S_OK Field?如何避免与 VSConstants.S_OK 字段的命名冲突?
【发布时间】:2014-02-28 10:30:55
【问题描述】:

这是场景:

我有 WSCF Blue 生成的 C# Web 服务客户端,我必须从 C 调用它。我使用 C++ CLI“桥”来完成它。在 C# Web 服务客户端我有

namespace MyCompany.Product.ExternalPlan.Client
{
    public enum TMsgStatus
    {
        S_OK,
        //...
        E_ERROR,
    }

这很好。

C++ CLI 项目做这样的事情(这不在任何命名空间中!!):

try 
{
    EPClient::Client^ client = gcnew EPClient::Client();
    m_ResponseHeader = client->CreateExternalProject(n_Project->Id, m_ProjectData,     m_NameValuePairs,    // in 
                                    m_PlanAndWorksExternal, ConvertNativeToManaged(n_UserName),         // in 
                                    m_ProjectRet, m_PlanAndWorksRet);                                   // out
}
catch (Exception ^ e)
{
    // ...
    return -1;
}

if (m_ResponseHeader->Status == MyCompany::Product::ExternalPlan::Client::TMsgStatus::S_OK)
{
    ConvertManagedToNative(n_ProjectRet, m_ProjectRet);
} 

现在,如果我将上面 if 语句中的 S_OK 更改为 E_ERROR,那就没问题了。我读到 C++ 中的枚举是全局的,所以我认为这就是它与这个 VS 的东西混合在一起的原因。我对 C++ 编程几乎一无所知。 C++ 代码是从 C 调用的,我有类似的示例,它没有命名空间。我认为这甚至不重要,因为我指的是带有完整命名空间的 S_OK。

感谢和最好的问候! -马蒂

【问题讨论】:

  • 在 C++ 11 中,您可以创建非全局枚举(google enum class,例如 cprogramming.com/c++11/…)。此外,如果您仍然遇到枚举问题,请尝试在代码中直接使用 integer 值而不是 S_OK 作为非常快速(可能不是最佳)的解决方案。
  • S_OK 是一个出现在 Windows SDK #include 文件中的 。预处理器将其转换为 ((HRESULT)0)。它在 COM 代码中很重要。如果在 C# 源代码中重命名它是一个问题,那么 #undef 是一个有效的解决方法。只要你不写任何 COM 代码 :)

标签: c++ enums c++-cli native managed


【解决方案1】:

我认为这更多的是#define 的问题而不是命名空间。在使用它的代码之前尝试#undef S_OK

【讨论】:

    猜你喜欢
    • 2013-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-02
    • 2011-07-30
    • 2017-05-01
    • 1970-01-01
    • 2011-11-25
    相关资源
    最近更新 更多