Префиксы sz и pwsz в WinAPI

Теперь я немного запутался с префиксами венгерской нотации в WinAPI для строк CHAR и строк WCHAR. Когда мы используем строку CHAR, обычно используется такой префикс:

CHAR szString[] = "Hello";

У нас есть строка с нулевым завершением szString, так что все в порядке. Но когда мы используем строку WCHAR, обычно используется такой префикс:

WCHAR pwszString[] = L"Hello";

Он означает указатель на широкую строку, оканчивающуюся нулем... но наш тип не выглядит так. Указатель на заканчивающуюся нулем широкую строку — WCHAR** или PWSTR*. Я ошибся? Почему это sz для строк CHAR и pwsz, а не wsz для строк WCHAR?


person spandei    schedule 15.04.2013    source источник
comment
Даже изобретатель венгерской нотации сказал, что это плохая идея. Я бы забыл обо всем этом.   -  person john    schedule 15.04.2013
comment
Не парься. Имя — это просто имя.   -  person Alexey Frunze    schedule 15.04.2013
comment
Как и во всех венгерских обозначениях, цель p (применяется к массиву, но подразумевает, что это указатель) - ввести в заблуждение и запутать будущих сопровождающих. Код было сложно писать, так почему его должно быть легче читать?   -  person Mike Seymour    schedule 15.04.2013
comment
@john: Нет. Изобретатель венгерской нотации в ужасе от людей, которые обвиняют его в системе венгерского языка, что является плохой идеей. В том, как его использовал Симони, многое понравилось. en.wikipedia.org/wiki/Hungarian_notation   -  person Ben Voigt    schedule 15.04.2013


Ответы (2)


Второй пример вводит в заблуждение (хотя и не редкость). Это должно быть одно из этих двух:

WCHAR wszString[] = L"Hello";
WCHAR *pwszString = L"Hello";

Поскольку массив можно использовать в большинстве контекстов, где ожидается указатель, некоторые программисты немного небрежно относятся к различию.

Венгерский язык не в моде, но он может быть при правильном использовании.

person Adrian McCarthy    schedule 15.04.2013
comment
О, спасибо, это была одна из моих догадок насчет wsz и pwsz :) И какой тогда префикс должен иметь WCHAR**? - person spandei; 16.04.2013
comment
WCHAR **ppwszString. Помните, что современный венгерский язык не столько связан с базовым типом, о котором заботится компилятор, сколько с типом данных, о которых должен знать программист. На самом деле не должно быть вопроса «Какой префикс для WCHAR**?». WCHAR** может быть просто указателем на указатель на один символ, в этом случае это будет WCHAR **ppwch. - person Adrian McCarthy; 16.04.2013

CHAR szString[] является синонимом CHAR * szString. Оба являются указателями на строки. Указатель на завершающуюся нулем строку — это CHAR*, а указатель на расширенную строку с завершающим нулем — WCHAR* (не WCHAR**).

Теперь, если вы хотите стать педантичным, вы можете (ошибочно) заявить, что CHAR[] - это «просто массив символов», и в этом случае «rgc» может быть правильным префиксом.

person RobH    schedule 15.04.2013
comment
Они являются синонимами только тогда, когда появляются как параметры функции. В противном случае они представляют собой массив CHAR и указатель на CHAR соответственно. - person Alexey Frunze; 15.04.2013
comment
Пожалуйста, просветите меня. Как вы думаете, в чем разница между ними? - person RobH; 15.04.2013
comment
@RobH, например, имея CHAR arrString[] и CHAR * pString, вы получите разные результаты для sizeof(arrString) и sizeof(pString). - person shakurov; 15.04.2013
comment
@RobH: Массивы и указатели так же различны, как любые два разных типа; просто происходит стандартное преобразование из одного в другое. Как уже отмечалось, они имеют разные размеры; они также по-разному участвуют в разрешении перегрузки. - person Mike Seymour; 15.04.2013
comment
Интересно. В какой момент на временной шкале от C до C++0x массивы перестали быть синтаксическим сахаром для указателей? - person RobH; 15.04.2013
comment
@RobH: я не знаком с историей C до 1989 года, но я совершенно уверен, что они всегда были разными типами в обоих языках. Массив — это кусок памяти, содержащий объекты; указатель — это место хранения объекта. - person Mike Seymour; 15.04.2013
comment
@Mike K&R, раздел 5.3, может оказаться полезной ссылкой и согласуется с вашими комментариями. Выборочно цитируя (гм), [...] имя массива является синонимом местоположения исходного элемента[...]. - person RobH; 15.04.2013
comment
@RobH Не во всех контекстах. То, что вы цитируете, верно для примера, из которого вы берете цитату. sizeof (уже упомянутый) и & дают разные результаты для массивов. - person Alexey Frunze; 16.04.2013
comment
Спасибо @AlexeyFrunze, Майку и Шакурову. Это хороший день, когда я узнаю что-то новое (возвращаемый тип &array) и должен подумать о фундаментальной языковой конструкции. - person RobH; 16.04.2013
comment
У меня были такие моменты с Си. Я могу относиться к вашему опыту. - person Alexey Frunze; 16.04.2013