這裏是場景:如何避免與VSConstants.S_OK字段的命名衝突?
我有WSCF藍色生成的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);
}
現在,如果我改變S_OK的if語句上面E_ERROR沒關係。我讀過C++中的枚舉是全局的,所以我認爲這是它與這個VS事物混合的原因。我對C++編程幾乎一無所知。從C調用C++代碼,我有類似的例子沒有命名空間。我不認爲這很重要,因爲我用全名命名空間來引用S_OK。
謝謝&最好的問候! -matti
在C++ 11中,您可以創建非全局枚舉(Google'enum class',例如,http://www.cprogramming.com/c++11/c++11-nullptr-strongly-typed-enum -class.html)。此外,如果您仍然遇到枚舉問題,請嘗試在代碼中使用直接的'integer'值而不是'S_OK'作爲非常快速(可能不是最好的)解決方案。 – Vitaliy
S_OK是出現在Windows SDK #include文件中的*宏*。預處理器將其轉換爲(((HRESULT)0)。這在COM代碼中很重要。如果在C#源文件中重命名是個問題,那麼#undef是一個有效的解決方法。只要你不寫任何COM代碼:) –