Konwencje prototypów funkcji
Zestaw Windows SDK udostępnia prototypy funkcji w ogólnych, stronie kodowej systemu Windowsi wersjach Unicode. Prototypy można skompilować w celu utworzenia prototypów stron kodowych systemu Windows lub prototypów Unicode. Wszystkie trzy prototypy zostały omówione w tym temacie i zostały zilustrowane przez przykłady kodu dla funkcji SetWindowText.
Poniżej przedstawiono przykład ogólnego prototypu.
BOOL SetWindowText(
HWND hwnd,
LPCTSTR lpText
);
Plik nagłówka zawiera ogólną nazwę funkcji zaimplementowaną jako makro.
#ifdef UNICODE
#define SetWindowText SetWindowTextW
#else
#define SetWindowText SetWindowTextA
#endif // !UNICODE
Preprocesor rozszerza makro na stronę kodową systemu Windows lub nazwę funkcji Unicode. Litera "A" (ANSI) lub "W" (Unicode) jest dodawana na końcu ogólnej nazwy funkcji, zgodnie z potrzebami. Następnie plik nagłówka zawiera dwa konkretne prototypy, jeden dla stron kodu systemu Windows i jeden dla Unicode, jak pokazano w poniższych przykładach.
BOOL SetWindowTextA(
HWND hwnd,
LPCSTR lpText
);
BOOL SetWindowTextW(
HWND hwnd,
LPCWSTR lpText
);
Jak wyjaśniono w typy danych systemu Windows dla ciągów, prototyp funkcji ogólnej używa typu danych LPCTSTR dla parametru tekstowego. Jednak prototyp strony kodowej systemu Windows używa typu LPCSTR, a prototyp Unicode używa LPCWSTR.
W przypadku wszystkich funkcji z argumentami tekstowymi aplikacje powinny zwykle używać prototypów funkcji ogólnych. Jeśli aplikacja definiuje kod "UNICODE" przed instrukcjami #include dla plików nagłówka lub podczas kompilacji, instrukcje zostaną skompilowane w funkcjach Unicode.
Nuta
Nowe aplikacje systemu Windows powinny używać formatu Unicode, aby uniknąć niespójności różnych stron kodu i ułatwienia lokalizacji. Powinny one być zapisywane przy użyciu funkcji ogólnych i powinny definiować kod UNICODE w celu skompilowania funkcji w funkcjach Unicode. W kilku miejscach, w których aplikacja musi pracować z danymi 8-bitowymi znakami, może jawnie korzystać z funkcji na stronach kodu systemu Windows.
Aplikacja powinna zawsze używać prototypu funkcji ogólnej z ogólnymi typami ciągów i znaków. Wszystkie nazwy funkcji kończące się wielkimi literami "W" przyjmują Unicode, czyli szeroki znak, parametry. Niektóre funkcje istnieją tylko w wersjach Unicode i mogą być używane tylko z odpowiednimi typami danych. Na przykład LCIDToLocaleName i LocaleNameToLCID mają tylko wersje Unicode.
Sekcja Wymagania w dokumentacji referencyjnej dla każdej funkcji Unicode i zestawu znaków zawiera informacje na temat wersji funkcji implementowanych przez obsługiwane systemy operacyjne. Jeśli dołączono wiersz rozpoczynający się od "Unicode", funkcja ma oddzielne wersje stron kodowych Unicode i Windows.
Nuta
Jeśli funkcja ma parametr długości dla ciągu znaków, długość powinna być udokumentowana jako liczba wartości TCHAR w ciągu. Ten typ danych odnosi się do bajtów dla wersji strony kodowej systemu Windows funkcji lub 16-bitowych słów dla wersji Unicode. Jednak funkcje, które wymagają lub zwracają wskaźniki do nietypowych bloków pamięci, takich jak funkcja GlobalAlloc, zazwyczaj przyjmują rozmiar w bajtach, niezależnie od używanego prototypu. Jeśli alokacja nietypowej pamięci dotyczy ciągu, aplikacja musi pomnożyć liczbę znaków przez sizeof(TCHAR). Aby uzyskać dodatkowe informacje, zobacz Using Generic Data Types.
Tematy pokrewne