Форум С++

 

Ответить на сообщение

Вернуться к теме

Вы отвечаете на сообщение:

Автор: cheops   (10.01.2012 в 15:23)
>Спасибо, что-то начинает проясняться. А классический main() чем Microsoft не угодил, или после
>всего того, что они сделали с C++, они просто удержаться не смогли, чтобы не заменить его на
>_tmain()? Так сказать, для однообразия...
Этим только дай язык в руки, моментально из него что-то свое сделают :))) Но на самом деле была причина, перехода на _tmain(). Сразу скажу, что если вам не нужно принимать параметры в программе, а _tmain() безумно раздражает, можете заменять его на классический main() без параметров int main(void).
А дело было так, создали в Microsoft операционную систему Windows, которая в силу причин (не будем сейчас вдаваться каких) завоевало мировое господство. Но так как создавалась система очень давно в условиях жесткой экономии памяти, использовалась однобайтовая кодировка (если что такое кодировка не понятно - лучше завести отдельную тему под обсуждение). Т.е. для использования языка приходилось постоянно менять кодировки. Расплодилось их море разливное, только для русского языка до сих пор штук 6 активно используется. Если помножить это на количество языков - получается полная вакханалия.
Тогда решили создать такую систему кодирования, которая бы поддерживала все языки без переключения между кодировками. Создали UNICODE - многобайтовую кодировку. Понятно без подводных камней не обошлось. Кодировать можно по разному. Самый простой вариант тупо использовать 2 байта под каждый символ, именно этот тип UNICODE сейчас используется в Windows. В миру эта кодировка называется UTF-16. Быстро выяснилось, что использовать эту кодировку в сети невозможно - некоторые последовательности используются в управляющих кодах. Да и вообще 2 байта под символ, это много для английского (второй байт всегда пустой), но мало для других языков (не все алфавиты влезли в 65000 символов). Тогда придумали продвинутый вариант UNICODE, систему UTF-8, когда английские символы кодируются при помощи одного байта, а символы других языков при помощи двух, трех, а то и четырех байт. Понятное дело, кодировка решает все проблемы с сетью. Эта кодировка получила бешеную популярность в сети Интернет. Ну а Windows так и работает с UTF-16. Все бы было хорошо, только давайте вспомним, как выглядит классический main(), принимающий параметры
int main(int argc, char *argv[]){
  ...
}
а принимает он количество аргументов и двумерный массив параметров однобайтовых строк char*. В этом то и проблема, при использовании двухбайтовых строк. Размер char менять нельзя - он жестко задан стандартом, значит, если вы хотите использовать UTF-16, приходится менять main(), отсюда и _tmain(). Вы можете использовать и классический, так сказать, однобайтовый main(), но вам придется переключить проект в Visual Studio в однобайтовый режим (по умолчанию включен режим поддержки многобайтовой кодировки).


Ваше имя:

Пароль:

Цитировать

Используйте тэги для выделения текста:
Код: [code][/code]
Жирный: [b][/b]
Наклонный: [i][/i]
URL: [url][/url]

Сообщение:

Прикрепить: