这是Visual Studio 2010(Visual C++ 10.0)中MFC源程序的WINMAIN.CPP文件代码(渲染代码我目前做不好,如果有经验者能帮助一下最好):
int AFXAPI AfxWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
_In_ LPTSTR lpCmdLine, int nCmdShow)
{
ASSERT(hPrevInstance == NULL);
int nReturnCode = -1;
CWinThread* pThread = AfxGetThread();
CWinApp* pApp = AfxGetApp();
// AFX internal initialization
if (!AfxWinInit(hInstance, hPrevInstance, lpCmdLine, nCmdShow))
goto InitFailure;
// App global initializations (rare)
if (pApp != NULL && !pApp->InitApplication())
goto InitFailure;
// Perform specific initializations
if (!pThread->InitInstance())
{
if (pThread->m_pMainWnd != NULL)
{
TRACE(traceAppMsg, 0, "Warning: Destroying non-NULL m_pMainWnd\n");
pThread->m_pMainWnd->DestroyWindow();
}
nReturnCode = pThread->ExitInstance();
goto InitFailure;
}
nReturnCode = pThread->Run();
InitFailure:
#ifdef _DEBUG
// Check for missing AfxLockTempMap calls
if (AfxGetModuleThreadState()->m_nTempMapLock != 0)
{
TRACE(traceAppMsg, 0, "Warning: Temp map lock count non-zero (%ld).\n",
AfxGetModuleThreadState()->m_nTempMapLock);
}
AfxLockTempMaps();
AfxUnlockTempMaps(-1);
#endif
AfxWinTerm();
return nReturnCode;
}
微软自己都是goto用得不亦乐乎,用goto也没什么不可以,特别是在要做错误后集中清理的情况下,如果没有try...catch...finally这样的控制结构,goto反而可能是一种很清晰简单的做法。
笔者从非结构化的BASIC语言(就是那种老式带行号的)开始编程,一直保留着用goto的习惯,goto并不是编程中的绝对禁忌。
任何时候,都是人选择合适的编程语言和语言特性使用,不是人被编程语言牵着鼻子走。