Вопрос

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

static LPCTSTR szWindowClass = TEXT("MyApp");

Или это:

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

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

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

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

Это было полезно?

Решение

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

Эквивалентное объявление LPCTSTR:

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

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

Другие советы

Поскольку строки Unicode являются родными от Windows NT, если вы не хотите, чтобы ваше приложение работало на ANSI-Native 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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top