_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:
-W
. Вместо CreateWindow вызовите CreateWindowW). И вместо использования char
используйте wchar_t
, и так далее char
для строк. То же самое относится к типам строк, определенным в windows.h: LPCTSTR преобразуется в LPCSTR или LPCWSTR, и для каждого другого типа, который включает char или wchar_t, всегда существует версия -T-, которую можно использовать вместо этого.
Обратите внимание, что все это специфично для Microsoft. TCHAR - это не стандартный тип C ++, это макрос, определенный в windows.h. wmain и _tmain также определены только Microsoft.
соглашение _T используется для указания, что программа должна использовать набор символов, определенный для приложения (Unicode, ASCII, MBCS, и т.д.). Вы можете заключить свои строки в _T (), чтобы они сохранялись в правильном формате.
cout << _T( "There are " ) << argc << _T( " arguments:" ) << endl;
_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», что кажется последней модой. Оба работают нормально.
Конец обновления