Форум: Форум C++Разное
Новые темы: 00
Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум C++

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Чем try отличается от __try?
 
 автор: asker++   (10.01.2012 в 14:21)   письмо автору
 
 

Вообще не понимаю коды Visual Studio C++. Вот зачем использовать __try, если есть ключевое слово try и оно работает нормально? Ради __finally? Почему в Builder все нормально и максимально близко к стандарту, а тут постоянно какая-то самодеятельность? Это потом вообще никуда перенести невозможно...

  Ответить  
 
 автор: cheops   (10.01.2012 в 14:38)   письмо автору
 
   для: asker++   (10.01.2012 в 14:21)
 

Дело в том, что обычный try - это классические исключения C++, можете использовать их для создания переносимого кода. Ключевое же слово __try относится к исключениям Windows API, они вообще говоря отличаются от исключений C++, они даже появились раньше, чем стандарт C++. Вообще использование символов подчеркивания для системных вызовов, ключевых слов и т.п. довольно характерный прием, причем не только для Windows, в UNIX это дело тоже очень любят и уважают.

Это просто разные исключения, одно для исключений C++, другое для исключений Windows, они отличаются друг от друга методом обработки, правда, рядом ухищрений (при помощи _set_se_translator()) их можно подружить и использовать везде try. Однако, от _set_se_translator() и предопределенных исключений Windows API ваш код переносимее не станет. Все-равно участки с использованием Windows API придется переписывать.

  Ответить  
 
 автор: asker++   (10.01.2012 в 14:57)   письмо автору
 
   для: cheops   (10.01.2012 в 14:38)
 

Спасибо, что-то начинает проясняться. А классический main() чем Microsoft не угодил, или после всего того, что они сделали с C++, они просто удержаться не смогли, чтобы не заменить его на _tmain()? Так сказать, для однообразия...

А если серьезно, посоветуйте толковую книгу по этому делу (имеется в виду по Visula Studio)? Откуда вы все это узнаете?

  Ответить  
 
 автор: cheops   (10.01.2012 в 15:23)   письмо автору
 
   для: asker++   (10.01.2012 в 14:57)
 

>Спасибо, что-то начинает проясняться. А классический 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 в однобайтовый режим (по умолчанию включен режим поддержки многобайтовой кодировки).

  Ответить  
 
 автор: asker++   (10.01.2012 в 16:29)   письмо автору
 
   для: cheops   (10.01.2012 в 15:23)
 

Спасибо. После объяснений, выглядит все разумно... только все-равно как-то это неправильно... Старый уважаемый язык, еще можно понять зачем новые ключевые слова для Windows API, параллельности, ассемблерных вставок: не хочешь, не пользуйся. Даже WinMain() можно понять, но новый _tmain() принять не могу! Ничего святого у Microsoft нет! Я лучше через файлы параметры передам, чем этой хренью пользоваться буду!

  Ответить  
 
 автор: cheops   (10.01.2012 в 20:17)   письмо автору
 
   для: asker++   (10.01.2012 в 16:29)
 

Можно, кстати, без файлов, теми же каналами или событиями воспользоваться - и параметры не нужны и данные между процессами передадите... но для этого потребуется воспользоваться опять же функциями Windows API. Да и вообще C++ создавался во времена и для задач, когда однопроцессорные машины составляли подавляющее большинство. Более того, однопроцессорные машины уверенно победили многопроцессорные, т.е. вводить на уровне языка операторы для обеспечения параллельной работы было не с руки, так как не понятно, что делать с этими операторами на однопроцессорных машинах. Тут волей не волей, приходится обращаться к возможностям операционных систем - системным вызовам. Идея полностью переносимого кода она, конечно, красивая, но за неё приходиться расплачиваться, скоростью, потребляемым объемом памяти, как в той же Java.

  Ответить  
 
 автор: cheops   (10.01.2012 в 15:34)   письмо автору
 
   для: asker++   (10.01.2012 в 14:57)
 

>А если серьезно, посоветуйте толковую книгу по этому делу (имеется в виду по Visula Studio)?
>Откуда вы все это узнаете?
По поводу книги довольно сложно... Во-первых, C++ сейчас не на пике популярности, на нем не очень то много новых проектов начинают с одной стороны (как-то C# популярнее), т.е. новых книг выпускают мало, а старые посвящены большей частью стилю кодирования Visual Studio 6 (т.е. без поддержки UNICODE). С другой стороны чтобы освоить программирование под Windows одной книги мало, нужно где-то 10000 страниц прочитать. Поэтому кому надо зачастую просто читают MSDN. Однако, кое-что посоветовать можно, например, те же системные вещи вроде __try неплохо описаны в Системное программирование в Windows, там правда ориентация на однобайтовую кодировку, если же интересно познакомиться с приемами кодирования именно в новых версиях Visual Studio, то можно ориентироваться на книгу Visual C++ 2010. Полный курс, правда пол книги - классический C++, по которому у вас уже вероятно имеется книга (а может и не одна), но что такое _tmain() и с чем его едят в ней найти можно.

  Ответить  
 
 автор: asker++   (10.01.2012 в 16:32)   письмо автору
 
   для: cheops   (10.01.2012 в 15:34)
 

Спасибо, почитаем. Сколько нужно перелопатить примерно представляю, имхо 10000 это только минимум с которого можно более или менее комфортно начинать работать.

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования