Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
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.