wmain vs main C runtime
Я прочитал несколько статей о различных входных пулах Windows C, wmain и WinMain.
Итак, если я прав, они добавляются в компиляторы языка Си для ОС Windows. Но как это реализовано?
Например, wmain получает Unicode как argv[], но его Os, который отправляет эти аргументы в программу, есть ли в записи файла.exe какое-либо специальное поле, в котором говорится, чтобы windows передавал аргументы как unicode? Благодарю.
2 ответа
Современные версии Windows внутренне используют UTF-16. Поэтому, когда вы запускаете исполняемый файл, все аргументы командной строки, скорее всего, передаются как UTF-16 с самого начала, и библиотека времени выполнения, связанная с запущенным приложением, либо передает аргументы без изменений (если используется wmain
) или автоматически преобразует их в локальную кодировку (при использовании main
). (В частности, это будет сделано wmainCRTStartup
/mainCRTStartup
которые являются фактическими точками входа, используемыми для консольных приложений Windows.)
Во-первых, педантичная напыщенная речь: wmain определенно не получает аргументы Unicode. Юникод определяется независимо от какой-либо конкретной кодировки. wmain получает аргументы в 16-битной кодировке Unicode, UTF-16 в предположении. Я только что проверил документацию Microsoft по wmain и ссылки на нее, и стало ясно, что Microsoft не имела ни малейшего представления о том, что такое Unicode, когда они это писали.
В любом случае, точка входа в программу определяется компоновщиком. Программа A C всегда имеет определенный код пролога, который выполняется до main/wmain/WinMain/wWinMain. Если используется одна из широких версий main, код пролога преобразует символы в среде из любого набора символов, в котором они находятся, в версию широких символов.