Я пытаюсь найти замену LPWSTR для переноса проекта на gcc.
typedef __nullterminated WCHAR *NWPSTR, *LPWSTR, *PWSTR;
Что теряет значение null? так было бы безопасно, если бы я сделал что-то вроде этого:
typedef WCHAR *LPWSTR
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-16STR
: строкаТак, 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-концевых строк.