Каково различие между _tmain () и основной () в C++?

222
задан joshcomley 21 May 2009 в 12:45
поделиться

3 ответа

_tmain не существует в C ++. main выполняет.

_tmain является расширением Microsoft.

main является, согласно стандарту C ++, точкой входа в программу. Он имеет одну из этих двух подписей:

int main();
int main(int argc, char* argv[]);

Microsoft добавила wmain, которая заменяет вторую подпись на это:

int wmain(int argc, wchar_t* argv[]);

А затем, чтобы упростить переключение между Unicode (UTF-16) и их многобайтовым набором символов, они определили _tmain , который, если включен Unicode, компилируется как wmain , а в противном случае как main .

Что касается второй части вашего вопроса , первая часть головоломки заключается в том, что ваша основная функция неверна. wmain должен принимать аргумент wchar_t , а не char . Поскольку компилятор не обеспечивает этого для функции main , вы получаете программу, в которой массив строк wchar_t передается в функцию main , которая интерпретирует их как строки char .

Теперь в кодировке UTF-16, используемом Windows при включенном Unicode, все символы ASCII представлены в виде пары байтов \ 0 , за которыми следует значение ASCII.

И поскольку процессор x86 является прямым порядком байтов, порядок этих байтов меняется, так что сначала идет значение ASCII, а затем - нулевой байт.

А как обычно заканчивается строка в строке символов? Да, нулевым байтом. Таким образом, ваша программа видит набор строк, каждая длиной в один байт.

В общем, у вас есть три варианта при программировании Windows:

  • Явно использовать Unicode (вызов wmain и для каждой функции Windows API, которая принимает связанные с символами символы аргументов, вызовите версию функции -W . Вместо CreateWindow вызовите CreateWindowW). И вместо использования char используйте wchar_t , и так далее
  • Явно отключите Unicode. Вызовите main и CreateWindowA и используйте char для строк.
  • Разрешите оба. (вызовите _tmain и CreateWindow, которые разрешаются в main / _tmain и CreateWindowA / CreateWindowW) и используйте TCHAR вместо char / wchar_t.

То же самое относится к типам строк, определенным в windows.h: LPCTSTR преобразуется в LPCSTR или LPCWSTR, и для каждого другого типа, который включает char или wchar_t, всегда существует версия -T-, которую можно использовать вместо этого.

Обратите внимание, что все это специфично для Microsoft. TCHAR - это не стандартный тип C ++, это макрос, определенный в windows.h. wmain и _tmain также определены только Microsoft.

351
ответ дан 23 November 2019 в 04:02
поделиться

соглашение _T используется для указания, что программа должна использовать набор символов, определенный для приложения (Unicode, ASCII, MBCS, и т.д.). Вы можете заключить свои строки в _T (), чтобы они сохранялись в правильном формате.

 cout << _T( "There are " ) << argc << _T( " arguments:" ) << endl;
9
ответ дан 23 November 2019 в 04:02
поделиться

_tmain - это макрос, который переопределяется в зависимости от того, компилируете ли вы с Unicode или ASCII. Это расширение Microsoft, и его работа с другими компиляторами не гарантируется.

Правильное объявление -

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

Если макрос UNICODE определен, он расширяется до

int wmain(int argc, wchar_t *argv[])

В противном случае он расширяется до

int main(int argc, char *argv[])

Ваше определение идет для каждого из них, и (если у вас определен UNICODE) расширится до

 int wmain(int argc, char *argv[])

, что совершенно неверно.

std :: cout работает с символами ASCII. Если вы используете широкие символы, вам понадобится std :: wcout.

попробуйте что-нибудь вроде этого

#include <iostream>
#include <tchar.h>

#if defined(UNICODE)
    #define _tcout std::wcout
#else
    #define _tcout std::cout
#endif

int _tmain(int argc, _TCHAR *argv[]) 
{
   _tcout << _T("There are ") << argc << _T(" arguments:") << std::endl;

   // Loop through each argument and print its number and value
   for (int i=0; i<argc; i++)
      _tcout << i << _T(" ") << argv[i] << std::endl;

   return 0;
}

Или вы можете просто решить заранее, использовать ли широкие или узкие символы. : -)

Обновлено 12 ноября 2013 г .:

Изменил традиционный «TCHAR» на «_TCHAR», что кажется последней модой. Оба работают нормально.

Конец обновления

35
ответ дан 23 November 2019 в 04:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: