这种代码结构如何组织?goto or do…while(0)? (二)

2014-11-24 12:03:42 · 作者: · 浏览: 6
dle(hProcess);
ERROR_LEVEL0:
return bRet;
}
(左边和右边哪种好一点。。。?)
在这种情形下,goto 的方案似乎是完美的。但是 goto 如果遇到 C++,缺点体现出来了。下面这一段,现在是 do…while(0) 结构(只有一层嵌套,这种结构用在这里还算合理):
BOOL foo()
{
HRESULT hr = CoInitializeEx(0, COINIT_MULTITHREADED);

while (true)
{
if (FAILED(hr))
{
break;
}

hr = CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_DEFAULT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, NULL);

if (FAILED(hr))
{
break;
}

CComPtr pLoc = NULL;
hr = pLoc.CoCreateInstance(CLSID_WbemLocator, NULL, CLSCTX_INPROC_SERVER);

if (FAILED(hr))
{
break;
}

CComPtr pSvc = NULL;
hr = pLoc->ConnectServer(_T("ROOT\\CIMV2"), NULL, NULL, NULL, 0, NULL, NULL, &pSvc);

if (FAILED(hr))
{
break;
}

hr = CoSetProxyBlanket(pSvc, RPC_C_AUTHN_WINNT, RPC_C_AUTHZ_NONE, NULL, RPC_C_AUTHN_LEVEL_CALL, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE);

if (FAILED(hr))
{
break;
}

CComPtr pEnum = NULL;
_bstr_t bstrLang = _T("WQL");
_bstr_t bstrSql = _T("SELECT * FROM __InstanceCreationEvent WITHIN 10")
_T("WHERE TargetInstance ISA 'Win32_LogonSession' AND (TargetInstance.LogonType = 2 OR TargetInstance.LogonType = 11)");
hr = pSvc->ExecNotificationQuery(bstrLang, bstrSql, WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY, NULL, &pEnum);

if (FAILED(hr))
{
break;
}

ULONG uCount = 1;
CComPtr pNext = NULL;
hr = pEnum->Next(WBEM_INFINITE, uCount, &pNext, &uCount);

if (FAILED(hr))
{
break;
}

// ...

break;
}

CoUninitialize();

return SUCCEEDED(hr);
}
如果改成 goto,则需要把所有需要对象的定义全放到最前面来,不然 goto 会跳过他们的初始化,编译不过。但是,所有对象都放到最前面定义,又违反了即用即声明的规则,而且太多了也容易混淆。
最后,问题是,如果遇到 C++ 的、多层嵌套的,大家一般如何组织代码呢?
谢谢!

摘自 溪流漫话