В листинге 1 вы говорите: «В моем коде есть определение main (), я обещаю!». Вот почему он компилируется. Но вы там лежите, поэтому ссылка не работает. Причина, по которой вы получаете отсутствующую ошибку WinMain16, заключается в том, что стандартные библиотеки (для компилятора Microsoft) содержат определение main (), которое вызывает WinMain (). В программе Win32 вы должны определить WinMain (), а компоновщик будет использовать библиотечную версию main () для вызова WinMain ().
В листинге 2 у вас есть определенный символ, называемый main, поэтому и компилятор, и компоновщик довольны, но код запуска попытается вызвать функцию, находящуюся в местоположении "main", и обнаружит, что на самом деле функции нет там и вылетает.