Windows C ++: LPCTSTR против const TCHAR - PullRequest
2 голосов
/ 07 июня 2010

В моем приложении я объявляю строковую переменную в верхней части моего кода, чтобы определить имя моего оконного класса, который я использую в своих вызовах RegisterClassEx, CreateWindowEx и т. Д. Теперь я знаю, что LPCTSTR является typedef и в конечном итоге перейдет к TCHAR (хорошо CHAR или WCHAR в зависимости от того, определен ли UNICODE), но мне было интересно, будет ли лучше использовать это:

static LPCTSTR szWindowClass = TEXT("MyApp");

Или это:

static const TCHAR szWindowClass[] = TEXT("MyApp");

Лично я предпочитаю использовать LPCTSTR из фона JavaScript, PHP, C #, я никогда не думал об объявлении строки как массива символов.

Но есть ли на самом деле какие-либо преимущества использования одного над другим, или на самом деле даже не имеет значения, какой из них я выберу?

Спасибо, заранее, за ваши ответы.

Ответы [ 3 ]

5 голосов
/ 07 июня 2010

Два объявления не идентичны. Первый создает указатель, второй - массив TCHAR. Различие может быть неочевидным, потому что массив будет разлагаться на указатель, если вы попытаетесь его использовать, но вы сразу заметите это, если попытаетесь поместить их в структуру, например.

Эквивалентная декларация LPCTSTR:

static const TCHAR * szWindowClass = TEXT("MyApp");

«L» в LPCTSTR означает «Long», что не имеет значения со времени 16-битного программирования Windows и может игнорироваться.

2 голосов
/ 07 июня 2010

Поскольку строки Unicode являются родными для Windows NT, если вы не хотите, чтобы ваше приложение работало на ANSI-собственной Windows 9x, всегда используйте строки широких символов (WCHAR или wchar_t типов).

Относительно вашего вопроса, обе формы могут казаться равными; но, хотя ожидается, что оба будут размещены в секции константных строк вашего исполняемого файла, строковые литералы не обязательно могут быть изменены при использовании в качестве инициализаторов массива.

например: (из C Faq, 16.6) Может произойти сбой следующего кода:

char *p = "HELLO";
p[0] = 'H';

Так что лучше всегда использовать:

char a[] = "HELLO";

Опять же, из C Faq: Строковый литерал может использоваться двумя слегка различными способами. Как инициализатор массива (как в объявлении char a []), он определяет начальные значения символов в этом массиве. В любом другом месте он превращается в безымянный статический массив символов, который может храниться в постоянной памяти, поэтому вы не можете безопасно его изменять. В контексте выражения массив обычно преобразуется сразу в указатель, как обычно (см. Раздел 6), поэтому второе объявление инициализирует p, чтобы указывать на первый элемент безымянного массива.

http://linuxdude.com/Steve_Sumit/C-faq/q1.32.html

0 голосов
/ 08 июня 2010

Форма массива предпочтительна для строковых литералов этого типа. Данные и код занимают (очень, очень незначительно) меньше места, и переменная не может быть изменена, чтобы указывать на другую строку. (На самом деле никакой переменной вообще нет, только имя для адреса первого символа в строке - в этом отношении он ведет себя очень похоже на буквальное значение.)

...