Let's try these )救中国研究院 A flag indicates whether a C++ object has been initialized BOOI m iNitialized A Session id DWORD dwSessionID A ref count in a C++ object LONG m cRef:// skip the a Pointer to byte buffer BYTE* pbBufferi A global logfile filename buffer CHAR g SZLOgEile [MAX PATH] A pointer to a global logfile CHAR* g pszLogEile;
16 Let’s try these… • A flag indicates whether a C++ object has been initialized: • BOOL m_fInitialized; • A Session ID: • DWORD dwSessionID; • A ref count in a C++ object: • LONG m_cRef; // skip the ‘l’ • A Pointer to BYTE buffer: • BYTE* pbBuffer; • A global logfile filename buffer: • CHAR g_szLogFile[MAX_PATH]; • A pointer to a global logfile: • CHAR* g_pszLogFile;
3凌波微步,未必摔跤 Evil goto’s? Maybe not Microsoft 软中国研究院 Why goto is bad Creates unreadable code Causes compiler to generate non-optimal code Why goto is good? Cleaner code Single entry, single exit Less duplicate code
17 3.凌波微步, 未必摔跤 - Evil goto’s? Maybe Not… • Why goto is bad? – Creates unreadable code… – Causes compiler to generate non-optimal code… • Why goto is good? – Cleaner code – Single entry, single exit – Less duplicate code
Spot the gotos 以中国研究院 START LOOP If (fstatusok) I if(fDataAvaiable) goto MID LOOP 1 else goto END LOoP i 1 else for(工=0;工<100;工++) MID LOOP / lots of code here goto STAR空LooP; END工ooP
18 Spot the gotos… START_LOOP: If (fStatusOk) { if (fDataAvaiable) { i = 10; goto MID_LOOP; } else { goto END_LOOP; } } else { for (I = 0; I < 100; I++) { MID_LOOP: // lots of code here … … } goto START_LOOP; } END_LOOP:
BAd gotos Microsoft )救中国研究院 f(fstatusok if(fDataAvaiable) I goto MID LOOP i 1 else goto END LOoP i 1 else BADII for(工=0;工 00;工++) MID LOOP / lots of code hiere gOto START END工ooP
19 BAD gotos!!! START_LOOP: If (fStatusOk) { if (fDataAvaiable) { i = 10; goto MID_LOOP; } else { goto END_LOOP; } } else { for (I = 0; I < 100; I++) { MID_LOOP: // lots of code here … … } goto START_LOOP; } END_LOOP: BAD!!!
How about this one? )救中国研究院 HRESULT工nit() pszHisName =(CHAR*)malloc(256)i if (pszHisName = NULL) I ps zMy Name =(CHAR*)malloc(256) free(pszMyName)i f (pszMYName = NULL) free(pszHerName)i return hr return hr ps zHerName =(CHAR*)malloc (256) if (pszHerName = NULL) t free(pszMYName)i free(pszMyName)i free (pszHerName)i return hr free(pszHisName)i return hr
20 How about this one? pszHisName = (CHAR*)malloc(256); if (pszHisName == NULL) { free(pszMyName); free(pszHerName); return hr; } free(pszMyName); free(pszHerName); free(pszHisName); return hr; } HRESULT Init() { pszMyName = (CHAR*)malloc(256); if (pszMyName == NULL) { return hr; } pszHerName = (CHAR*)malloc(256); if (pszHerName == NULL) { free(pszMyName); return hr; }