Sdílet prostřednictvím


Konvence kódování systému Windows

Pokud s programováním ve Windows teprve začínáte, může být znepokojující, když poprvé uvidíte program pro Windows. Kód je naplněn zvláštními definicemi typů, jako jsou DWORD_PTR a LPRECT, a proměnné mají názvy jako hWnd a pwsz (nazývané maďarština notace). Stojí za to chvíli se seznámit s některými konvencemi kódování windows.

Velká většina rozhraní API systému Windows se skládá z funkcí nebo rozhraní MODELU COM (Component Object Model). Jako třídy jazyka C++ je k dispozici velmi málo rozhraní API systému Windows. (Výjimkou je GDI+, jedno z 2D grafických rozhraní API.)

Typedefs

Hlavičky Windows obsahují velké množství typedef. Mnoho z nich je definováno v souboru hlaviček WinDef.h. Tady jsou některé, se kterými se setkáte často.

Celočíselné typy

Datový typ Velikost Podepsaný?
BYTE 8 bitů Nepodepsaný
DWORD 32 bitů Nepodepsaný
INT32 32 bitů Podepsaný
INT64 64 bitů Podepsaný
LONG 32 bitů Podepsaný
LONGLONG 64 bitů Podepsaný
UINT32 32 bitů Nepodepsaný
UINT64 64 bitů Nepodepsaný
ULONG 32 bitů Nepodepsaný
ULONGLONG 64 bitů Nepodepsaný
SLOVO 16 bitů Nepodepsaný

Jak vidíte, v těchto typedefů existuje určitá redundance. Některé z těchto překrývání jsou jednoduše způsobeny historií rozhraní API systému Windows. Uvedené typy mají pevnou velikost a velikosti jsou stejné v 32bitových i 64 aplikacích. Například typ DWORD je vždy 32 bitů široký.

Typ logické hodnoty

bool je alias typu pro int, odlišný od booljazyka C++ a od jiných typů, které představují logickou hodnotu. Soubor záhlaví WinDef.h také definuje dvě hodnoty pro použití s BOOL.

#define FALSE    0 
#define TRUE     1

Navzdory této definici TRUEvšak většina funkcí, které vracejí BOOL typ, může vrátit libovolnou nenulovou hodnotu, která označuje logickou pravdu. Proto byste měli vždy napsat toto:

// Right way.
if (SomeFunctionThatReturnsBoolean()) 
{ 
    ...
}

// or

if (SomeFunctionThatReturnsBoolean() != FALSE)
{ 
    ...
}

a ne toto:

if (result == TRUE) // Wrong!
{
    ... 
}

bool je celočíselný typ a není zaměnitelný s bool jazyka C++.

Typy ukazatelů

Systém Windows definuje mnoho datových typů formuláře ukazatel na X. Obvykle mají předponu P- nebo LP- v názvu. Například LPRECT je ukazatel naRECT, kde RECT je struktura popisovaná obdélníkem. Následující deklarace proměnných jsou ekvivalentní.

RECT*  rect;  // Pointer to a RECT structure.
LPRECT rect;  // The same
PRECT  rect;  // Also the same.

V 16bitových architekturách (16bitová verze Windows) existují 2 typy ukazatelů, P pro "ukazatel" a LP je zkratka "dlouhý ukazatel". Dlouhé ukazatele (označované také jako vzdálené ukazatele) byly potřeba k adresování rozsahů paměti mimo aktuální segment. Předpona LP byla zachována, aby bylo snazší portovat 16bitový kód do 32bitového systému Windows. Dnes neexistuje žádný rozdíl a tyto typy ukazatelů jsou všechny ekvivalentní. Nepoužívejte tyto předpony; nebo pokud ho musíte použít, použijte P.

Typy přesnosti ukazatele

Následující datové typy mají vždy velikost ukazatele: tj. mají šířku 32 bitů ve 32bitových aplikacích a 64 bitů ve 64bitových aplikacích. Velikost se určuje v době kompilace. Pokud 32bitová aplikace běží v 64bitovém systému Windows, jsou tyto datové typy stále široké 4 bajty. (64bitová aplikace nemůže běžet v 32bitovém systému Windows, takže nedochází k obrácené situaci.)

  • DWORD_PTR
  • INT_PTR
  • LONG_PTR
  • ULONG_PTR
  • UINT_PTR

Tyto typy se používají v situacích, kdy se celé číslo může převést na ukazatel. Používají se také k definování proměnných pro aritmetické ukazatele a k definování čítačů smyčky, které iterují v celém rozsahu bajtů v vyrovnávací paměti. Obecněji se zobrazují na místech, kde byla stávající 32bitová hodnota rozšířena na 64 bitů v 64bitovém systému Windows.

maďarská notace

Maďarská notace je postup, který zahrnuje přidání předpon k názvům proměnných, aby poskytly dodatečné informace o proměnných. (Vynálezce notace, Charles Simonyi, byl Maďar, proto jeho název).

V původní podobě dává maďarská notace sémantické informace o proměnné, které vám říkají zamýšlené použití. Například i znamená index, cb znamená velikost v bajtech (počet bajtů) a rw a col znamenají čísla řádků a sloupců. Tyto předpony jsou navržené tak, aby se zabránilo náhodnému použití proměnné v nesprávném kontextu. Pokud jste například viděli výraz rwPosition + cbTable, víte, že číslo řádku se přidává do velikosti, což je téměř jistě chyba v kódu.

Běžnější forma maďarštiny používá předpony pro typ informace – například dw pro DWORD a w pro WORD.

Poznámka

C++ Core Guidelines nedoporučuje notaci předpon (například maďarština). Viz NL.5: Vyhněte se informacím o typu kódování v názvech. Tým Windows ho interně nepoužívá. Jeho použití ale zůstává v ukázkách a dokumentaci.

Další

Práce s řetězci