Blog gunsmoker-a (lefordított), amiért a visszaadott értékek leíró így következetlen

Miért visszatérési értékek deszkriptorok így következetlen?

Miért van az, visszatérési értékek annyira más?

Az okok, ahogy már azt gyanítják - történelmi.

Ezek az értékek alapján választottuk megfontolások a kompatibilitás 16 bites Windows. 16-bites OpenFile funkciót, _lopen _lcreat és visszatér -1, ha hiba, így a 32-bites CreateFile függvény is visszaadja -1 (INVALID_HANDLE_VALUE), hogy megkönnyítse alkalmazás migráció a Win16.

(Fegyveres ezzel a tudással, akkor már válaszolni a következő egyszerű kérdést: miért, mikor kell hívni a CreateFile, de a valóságban nem nyissa meg a fájlt nem nevezett funkció OpenFile Válasz: Igen, OpenFile lenne a megfelelő nevet, de a név már foglalt.)

Másrészt, nem volt Win16 ekvivalens a CreateThread vagy CreateMutex, így azok újra 0.

Mivel egy precedens már kialakult ellentmondás visszatérési értékeket, azzal a kiegészítéssel, egy új funkció mindig egy választás között visszatérő 0 vagy INVALID_HANDLE_VALUE.

Ez a következetlenség számos következménye van.

Az első szerint, persze, meg kell, hogy alaposan ellenőrizze a visszatérési érték.

Második. Ez azt jelenti, hogy ha azt akarjuk, hogy írjon néhány wrapper egy közös leíró értékek - akkor meg kell különböztetni két lehetséges érték „nem tudja kezelni.”

Harmadszor, ha azt szeretnénk, hogy inicializálja a fogantyút értéket, akkor meg kell csinálni a különböző módon, attól függően, hogy a funkció, amellyel fogsz használni. Például, a következő kód hibás:
Ebben a kód két hibát. Először is, a visszatérési érték ellenőrizhető CreateFile rossz. A fenti kód vizsgálatok 0 helyett INVALID_HANDLE_VALUE. Másodszor, a hibásan inicializálja H. Ez a javított változat:
Negyedszer, meg kell, hogy legyen különösen óvatos, melynek értéke INVALID_HANDLE_VALUE: teljesen véletlenül, ez egybeesik a pszeudo-leíró visszaadott érték GetCurrentProcess. Sok kernel függvények, hogy ilyen ál-fogantyúval, így ha például csavart ki és véletlenül hívják, például értékű WaitForSingleObject INVALID_HANDLE_VALUE, végül meg fogja találni, hogy várnak a jelenlegi folyamat. Ez az elvárás, persze, soha nem lesz kész, mert a folyamat megy át a riasztási állapotot csak akkor jön ki, így a végén vár magára.

Kapcsolódó cikkek