SHLoadImageFile (L "\\ Program Files \\ TrainingApp \\ background.png"); для чего это L в аргументе? - PullRequest
0 голосов
/ 01 апреля 2010

я работал над c ++ в linux последние 2 года и недавно переключился на программирование под windows c ++.

может кто-нибудь сказать мне, что это за L в аргументе функции:

SHLoadImageFile(L"\\Program Files\\TrainingApp\\background.png");

и при просмотре определенного примера кода в MSVS C ++ я натолкнулся на множество типов определений типа ..

LPARAM // typedef LONG_PTR LPARAM ... здесь LONG_PTR снова является typedef как __w64 long

WPARAM // typedef UINT_PTR WPARAM ...

так что есть много связанных между собой typedefs .. Я никогда не видел такого большого количества typedef цепочек при программировании на c ++ в linux с использованием gcc ..

что я хочу сказать, так это то, что это просто создает больше путаницы для разработки приложений Windows ... хотя я видел программирование приложений на Linux с использованием фреймворков, таких как Qt ... там такие вещи используются редко ... так что есть конкретная цель в определении типа снова и снова на MSVSC ++ ?? например, есть typedefs вроде

typedef int BOOL;

какая польза от этого, когда уже доступен обычный bool .. ?? Есть сотни других случаев, когда я сталкивался с тем, что просто решить, какой тип данных использовать, становится настолько сложно ... Становится трудно понять заранее написанный код таким же образом ...

Спасибо.

Ответы [ 4 ]

2 голосов
/ 01 апреля 2010

L - это стандартная версия C, которая также действует в Linux. Он обозначает, что строковый литерал имеет значение wide для определения реализации wide. См. 6.4.5 спецификации C99.

Тип элементов массива - wchar_t вместо char, когда используется префикс L.

2 голосов
/ 01 апреля 2010

L в аргументе - это стандартный способ сообщить компилятору, что следующий строковый литерал - это Unicode, а не однобайтовые символы. Это эквивалентно постфиксу L, чтобы указать, что длинная целочисленная константа.

Windows typedefs действительно сбивают с толку, но как только вы обдумываете схему именования, они начинают обретать смысл.

Вы должны помнить, что этот API возник в начале 90-х годов. Таким образом, typedefs требуются для обработки указателей на разных архитектурах, а также для 32-64-битных типов, а также для компиляции на машинах, отличных от Intel.

Требуется отображение BOOL-> int, поскольку интерфейс совместим с C (не c ++) и поэтому не может использовать встроенный тип bool.

0 голосов
/ 01 апреля 2010

Буква L перед строковым литералом должна сделать его широкой строкой (то есть строкой Unicode).

Другие вещи, о которых вы спрашиваете, в основном исторические. Имейте в виду, что наследие Windows используется только в объектно-ориентированном (своего рода) API-интерфейсе, ориентированном на события. Это происходит вплоть до Win16 (в основном до Windows 95). Также имейте в виду, что Microsoft всегда умела использовать API с очень длинным витком и странные соглашения о кодировании. Вот почему вы видите такие вещи, как bool, определяемый как int (в те времена в C не было bool).

Вы упоминаете LPARAM и WPARAM ... они восходят к программированию Win16 / 23 и являются двумя параметрами, передаваемыми в насосе сообщений Win16 / 32/64. L означает долго (как это был длинный тип), а W означает слово, как это было. Эти значения содержали разные параметры в зависимости от сообщения (т. Е. Для события щелчка вниз окна оно могло содержать указатель в LPARAM на структуру, содержащую координаты события щелчка вниз).

Я уверен, что ничто из этого не поможет вам в принятии решения, какой тип использовать ... единственное, что я мог бы порекомендовать, - это чтобы вы узнали намного больше о устаревшем программировании Windows, если вам нужно это сделать. Но на вашем месте вы использовали что-то вроде Qt в Linux и хотели бы написать код для Windows ... почему бы не получить Qt для Windows и не использовать это? Он скрывает большую часть этой (откровенно говоря, устаревшей) детали от вас.

Надеюсь, это поможет!

0 голосов
/ 01 апреля 2010

L говорит компилятору использовать строку Unicode.

Существует также макрос _TEXT, который помогает создавать программы для платформ Unicode и не-Unicode. Он определяется как:

#define _TEXT(t) t      // this does noting

или

#define _TEXT(t) L ## t    // Adds L in front of the string

И, наконец, TCHAR, который может храниться в 1 или 2 байтах:

TCHAR mystring[] = _TEXT("text");

TCHAR устанавливается равным wchar_t, когда определено _UNICODE, и char, если это не так.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...