_tmain() почему такое название?

272
19 декабря 2016, 20:06

Почему такое имя дает VS, исполняющей функции, в консольном приложении?

Answer 1

Всё просто.

Для не-Unicode-программ используется соответствующее стандарту имя main и список параметров int argc, char* argv[].

Для Unicode-программ список параметров в MSVC выглядит как int argc, wchar_t* argv[], и во избежание конфликтов с исходниками и компиляторами, соответствующими стандарту, функция называется wmain.

Для программ, которые могут компилироваться и в Unicode-, и в не-Unicode-режиме, список аргументов выглядит как int argc, _TCHAR* argv[], где макрос _TCHAR определён как char или wchar_t в зависимости от значения макроса _UNICODE. Таким образом, нужно третье имя для функции. Так и было придумано имя _tmain.

Всё это, конечно, требует некоторой магии компоновщика, который должен уметь определить entry point не только в функции main, как по стандарту, а и в функциях wmain/_tmain.

Если вы уверены, что вам не нужно Unicode-приложение, вы можете переименовать функцию в main и дать ей список аргументов int argc, char* argv[], чтобы соответствовать стандарту. Или если вы твёрдо решили, что ваша программа будет запускаться лишь под линейкой WinNT/XP/7 (а не Win95/98), вы можете остановиться на Unicode-варианте и переименовать функцию в wmain (соответственно, аргументы должны быть int argc, wchar_t* argv[]).

Запоздалое уточнение (спасибо @alexolut): Согласно документации, _tmain определяется в <tchar.h> при помощи typedef как main или wmain, так что в вашей программе всё равно будет либо main, либо wmain.

(И да, вы можете опустить параметры, или добавить третий параметр envp, или задекларировать возвращаемый тип void.)

READ ALSO
Динамические массивы

Динамические массивы

Как правильно создать динамический массив на 100 элементов? Как удалить потом значение каждого его элемента? Как удалить весь динамический...

266
Актуальность COM, ATL, MFC

Актуальность COM, ATL, MFC

Здравствуйте

413
Инкремент, декремент

Инкремент, декремент

добрый день, вопрос такой, почему нельзя сделать так:

333
Bada: проблемы с кодировкой.

Bada: проблемы с кодировкой.

Как в Bada перевести строку кириллицы такой как, например, "папа" в следующий вид: "%D0%BF%D0%B0%D0%BF%D0%B0" ? Все примеры которые рассчитаны на чистый C++ не подходят

314