Запутался во всех различных типах строк и о том, как правильно их использовать в Visual C ++ - PullRequest
1 голос
/ 08 декабря 2011

Несколько лет назад я занимался базовым программированием на C. Теперь я пытаюсь переучить то, что я забыл, а также выучить Visual C ++.Я смущен, хотя все строковые параметры и теперь дополнительный уровень попытки сделать мои программы Unicode совместимыми.Я читал Beginning Visual C ++ 2010, а также читал онлайн, чтобы узнать эту информацию.

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

Код:

#include "stdafx.h"
#include <iostream>
#include <string>
#include "Windows.h"

using std::wcin;
using std::wcout;
using std::wstring;

int _tmain(int argc, _TCHAR* argv[])
{
    wstring myInput;

    wcout << "Enter a string: ";

    getline(wcin, myInput);

    MessageBoxW(NULL, myInput.c_str(), _T("Test MessageBox"), 64);

    return 0;
}

Синтаксис MessageBox:

int WINAPI MessageBox(
  __in_opt  HWND hWnd,
  __in_opt  LPCTSTR lpText,
  __in_opt  LPCTSTR lpCaption,
  __in      UINT uType
);

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

#include "stdafx.h"
#include <iostream>
#include <string>
#include "Windows.h"

using std::wcout;

int _tmain(int argc, _TCHAR* argv[])
{

    MessageBoxW(NULL, argv[1], _T("Test MessageBox"), 64);

    return 0;
}

Моя путаница:

  1. Почему мне нужно использовать c_str () для аргумента 2 для MessageBoxW и почему янужно использовать макрос _T () (?) в аргументе 3?

  2. Почему программа работала во втором примере кода без какого-либо преобразования?

  3. Что именно означает LPCTSTR?Я вижу другой вариант в функциях MSDN, называемый LPTSTR.

Спасибо!

Ответы [ 2 ]

1 голос
/ 08 декабря 2011

1) .c_str () - это стандартный C ++ метод для преобразования строк C ++ в строки C. _tmain, _T ('x'), _T ("text") и _TCHAR являются (несколько уродливыми) макросами Microsoft , которые заставляют вашу программу компилироваться в режиме Unicode или не Unicode. В параметрах проекта есть глобальная настройка, которая устанавливает некоторые макросы для настройки вашего проекта в одном из этих двух режимов.

Если вы находитесь в режиме не-Unicode (в документации MS к нему относится режим ANSI), макросы расширяются до:

main, 'x', "text", char

Если вы находитесь в режиме Unicode, макросы расширяются до

wmain, L'x ', L "text", wchar_t

2) и 3) Заголовки Windows полны typedef и подобных макросов. Иногда они делают код более неясным, чем он должен быть. В общем, LP означает указатель (я полагаю, длинный указатель, но прошло много времени с тех пор, как нам нужно было различить ближний и дальний указатели), C означает «констант», T означает, что это будет либо char, либо wchar_t в зависимости от настроек проекта, а STR , очевидно, является "строкой". В конце концов, это простой тип C, поэтому вы можете передавать ему строки C без преобразования.

0 голосов
/ 08 декабря 2011
  1. Функция MessageBoxW ожидает строку широких символов в стиле C (WCHAR ). Макрос _L () изменяет вашу строку так, чтобы она была совместима с Юникодом (WCHAR вместо char *).

  2. argv [] не делает объекты, поэтому вы уже получаете указатель WCHAR из него.

  3. LPCTSTR - это, в основном, тип определения WINAPI для const char * или const WCHAR *, в зависимости от того, используете ли вы UNICODE. Также смотрите этот пост: LPCSTR, LPCTSTR и LPTSTR

Короче говоря, вашей основной функции передаются строки WCHAR *, а MessageBoxW ожидает строки WCHAR *.

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