Для не-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 визначається в
(І так, ви можете опустити параметри, або додати третій параметр envp. Або задекларувати повертається тип void.)