다음은 시나리오입니다.VSConstants.S_OK 필드와 이름이 충돌하지 않도록하는 방법?
C에서 호출해야하는 WSCF Blue 생성 C# Web Service 클라이언트가 있습니다. C++ CLI "bridge"로 수행해야합니다. C# 웹 서비스 클라이언트에서 나는
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);
}
을 지금은 위가 괜찮 E_ERROR 할 경우 문에서 S_OK를 변경하는 경우. C++에서 enum을 전역 적으로 읽었 기 때문에 그것이 VS와 섞여있는 이유라고 생각합니다. C++ 프로그래밍에 대해서는 거의 아무것도 모른다. C++ 코드가 C에서 호출되었으며 비슷한 예제가 네임 스페이스가 없습니다. 전체 네임 스페이스를 가진 S_OK를 참조하기 때문에 문제가되지 않는다고 생각합니다.
감사합니다. & 최고 감사합니다! -matti
C++ 11에서는 비전 역 enum (google'enum class')을 만들 수 있습니다 (예 : http://www.cprogramming.com/c++11/c++11-nullptr-strongly-typed-enum). -class.html). 또한 열거 형에서 여전히 문제가 발생하는 경우 코드에서 'S_OK' 대신 직접'정수 '값을 사용하여 매우 빠른 (최선이 아닐 수도 있음) 해결책으로 사용하십시오. – Vitaliy
S_OK는 Windows SDK #include 파일에 나타나는 * 매크로 *입니다. 사전 처리기는이를 ((HRESULT) 0)로 변환합니다. COM 코드에서 중요합니다. C# 소스에서 이름을 바꾸는 것이 문제라면 #undef가 유효한 해결 방법입니다. 만큼 COM 코드를 작성하지 않는만큼 어쨌든 :) –