Что означает этот typedef для LPWSTR?

Я пытаюсь найти замену LPWSTR для переноса проекта на gcc.

typedef __nullterminated WCHAR *NWPSTR, *LPWSTR, *PWSTR;

Что теряет значение null? так было бы безопасно, если бы я сделал что-то вроде этого:

typedef WCHAR   *LPWSTR

1

Решение

typedef __nullterminated WCHAR * NWPSTR, * LPWSTR, * PWSTR;

__nullterminated часть является SAL аннотация. SAL — это специальная технология Microsoft для аннотирования параметров функций, возвращаемых значений, поведения функций и т. Д., Помогающая находить ошибки и уменьшать дефекты кода C / C ++ с помощью инструмента анализа кода Visual Studio. Вы можете прочитать о SAL здесь на MSDN:

Использование аннотаций SAL для уменьшения дефектов кода C / C ++

WCHAR определяется в заголовках Windows Platform SDK в основном как typedef для wchar_t, который является 16-битный тип символов в компиляторе Microsoft Visual C ++. Это используется как «символьная единица» для Юникод UTF-16 кодировка, которая используется по умолчанию де-факто Unicode-кодировка Windows API.
Обратите внимание, что другие компиляторы, такие как GNU GCC в Linux, учитывают wchar_t быть 32-битный символьная единица (не 16-бит), поэтому вам следует обратить внимание на переносимость вашего кода.

(Примечание: современные версии Windows поддерживают Unicode UTF-16 с так называемым суррогатные пары, так что вы можете иметь пара из смежных WCHARОпределение суррогатной пары.)

NWPSTR, LPWSTR а также PWSTR все синонимы, определенные как указатели в WCHARто есть учитывая также __nullterminated SAL аннотации, они являются указателями на «Сырой» Unicode UTF-16 строки в стиле C с NUL-окончанием.

По сути, это Windows Win32 Unicode, эквивалентный классическим C char*,

Я программирую Windows на C ++ в течение нескольких лет, и я никогда не встречал этого NWPSTR Если честно 🙂

Имя PWSTR построен с использованием следующих элементов:

  • Pуказатель
  • W: «широкий», то есть WCHAR/wchar_tна основе, то есть Unicode UTF-16
  • STR: строка

Так, PWSTR означает указатель на WCHAR/wchar_t строка, то есть строка Unicode UTF-16, как уже указано выше.

LPWSTR это просто старое имя для того же самого; начальный L средства «долго», и это восходит ко времени, когда были «длинные указатели» который может получить доступ к памяти дальше, чем «короткие» или «ближние» указатели 🙂 Таких дней больше нет.

И, если вы положите C в этих именах у вас есть typedefs только для чтения const аналоги, например: PCWSTR или же LPCWSTR в основном const wchar_t* Строки Unicode UTF-16 с нулевым символом в конце.

Ты найдешь PCWSTR и более старый эквивалент LPCWSTR используемый много в заголовочных файлах Windows и документации Windows API для представления Юникод UTF-16 «Вход» (Т.е. const) C-стиль NUL-концевых строк.

5

Другие решения


По вопросам рекламы [email protected]