Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
mrKi
2 / 2 / 0
Регистрация: 01.08.2013
Сообщений: 60
#1

Препроцессор,исключительные ситуации - C++

16.09.2013, 15:45. Просмотров 735. Ответов 17
Метки нет (Все метки)

Всем доброго времени суток!) По прочтению изложенного в моей книге материала по искл. ситуациям и операторам препроцессора(? так можно назвать вот это: "#define","#ifdef","#ifndef","#else" ?) возник ряд наверняка глупых вопросов.
1)Зачем нужны исключительные ситуации? По факту в блоке
C++
1
try {}
пишется код , и в случае чего,в нем же нужно сделать
C++
1
throw
,дабы
C++
1
catch
словил то что мы кинули через throw и выполнил какие-то действия. Зачем все это? Ведь можно сделать то же самое через ,к примеру, то же
C++
1
if..else
в случае чего завершив выполнения блока с помощью
C++
1
break;
?
2) Теперь по поводу препроцессора. В целом картина ясна, но опять же ,есть вопросы. Если просто написать
C++
1
#define big 700
,то смысл ясен(хотя можно и создать переменную/константу),но зачем (в книжке приводиться такой приме) делать более сложные конструкции? Ведь монжо просто создать функцию ,которая легче в написание,легче в понимание, да к тому же осуществляет контроль за типами!
3)Да и что скажите по поводу макроса
C++
1
assert()
Он используется?
Вот это мне не понятно.
Заранее спасибо за внятные,аргументированные ответы!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.09.2013, 15:45
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Препроцессор,исключительные ситуации (C++):

Исключительные ситуации - C++
Доброго времени суток. Возникла такая проблема. Никак не могу разобраться с исключительными ситуациями. Вот допустим, как здесь сделать,...

Исключительные ситуации - C++
Функция должна выполнять проверку параметров, передаваемых и генерировать исключения в случае ошибки. Без спецификаторов исключений; ...

Исключительные ситуации - C++
Почему программа не работает?? Исключительная ситуация возникающая при деление на нуль. Пользователь с клавиатуры должен ввести число, если...

исключительные ситуации - C++
почему не работает?? как надо?? #include<iostream> #include<conio.h> using namespace std; template<class T> class Vector...

исключительные ситуации - C++
Описать и реализовать функцию анализа номера телефона, обработайте ошибку создания номера в неверном формате (допустимый формат - +8 (095)...

исключительные ситуации - C++
Подскажите, как сделать переполнение в этой задаче: Создать класс для хранения обыкновенных дробей. Запрограммировать метод сокращения...

17
alex_x_x
бжни
2447 / 1652 / 84
Регистрация: 14.05.2009
Сообщений: 7,162
16.09.2013, 15:49 #2
Цитата Сообщение от mrKi Посмотреть сообщение
пишется код , и в случае чего,в нем же нужно сделать
в ральной жизни этот throw может лежать в 10 вызовах вложенности под вашей функцией, в другом модуле, в другой библиотеке итд

Добавлено через 2 минуты
Цитата Сообщение от mrKi Посмотреть сообщение
,то смысл ясен(хотя можно и создать переменную/константу),но зачем (в книжке приводиться такой приме) делать более сложные конструкции? Ведь монжо просто создать функцию ,которая легче в написание,легче в понимание, да к тому же осуществляет контроль за типами! Вот это мне не понятно.
проще только в простых примерах, препроцессор в си настолько обыден и распространен, что просто стоит посмотреть примеры
1
SatanaXIII
Супер-модератор
Эксперт С++
5616 / 2651 / 246
Регистрация: 01.11.2011
Сообщений: 6,530
Завершенные тесты: 1
16.09.2013, 15:57 #3
Цитата Сообщение от mrKi Посмотреть сообщение
Ведь можно сделать то же самое через ,к примеру, то же
C++
1
if..else
Бывают случаи, когда при самой проверке if программа в этом месте упадет.
1
mrKi
2 / 2 / 0
Регистрация: 01.08.2013
Сообщений: 60
16.09.2013, 16:11  [ТС] #4
С этим ясно,таки нужно учить. Как на счет
C++
1
assert()
?
0
Qwertiy
821 / 629 / 75
Регистрация: 20.08.2013
Сообщений: 2,523
16.09.2013, 16:19 #5
Цитата Сообщение от mrKi Посмотреть сообщение
Как на счет assert()
Это проверка условия при отладке. Нужна для того, чтобы всё упало, если условие не выполняется. Для этого и используется.
С ним надо быть осторожнее, поскольку при компиляции в релизе он может буть убран вместе с агрументом. Т. е. ничего изменять из него не стоит.
0
mrKi
2 / 2 / 0
Регистрация: 01.08.2013
Сообщений: 60
16.09.2013, 16:23  [ТС] #6
Qwertiy, суть того сто это я понял,не дурак. Используется ли он сейчас? Просто моя книга старовата,так уж вышло, не хотелось бы учиться пользоваться тем ,что неактуально
0
Qwertiy
821 / 629 / 75
Регистрация: 20.08.2013
Сообщений: 2,523
16.09.2013, 16:33 #7
Цитата Сообщение от mrKi Посмотреть сообщение
Используется ли он сейчас?
А что ты предлагаешь использовать вместо него? Мне вроде аналоги не известны...
0
mrKi
2 / 2 / 0
Регистрация: 01.08.2013
Сообщений: 60
16.09.2013, 16:35  [ТС] #8
Qwertiy, да я ничего не предлагаю, с моими знаниями .. Раз нет аналогов значит буду учиться как его использовать.

В общем все понятно. Спасибо.
0
Raali
623 / 327 / 34
Регистрация: 06.07.2013
Сообщений: 1,062
Завершенные тесты: 1
16.09.2013, 17:13 #9
Цитата Сообщение от Qwertiy Посмотреть сообщение
Нужна для того, чтобы всё упало, если условие не выполняется.
Разве чтобы упало? просто остановится тогда как на брейкпойнте
0
Croessmah
Эксперт CЭксперт С++
13416 / 7570 / 855
Регистрация: 27.09.2012
Сообщений: 18,632
Записей в блоге: 3
Завершенные тесты: 1
16.09.2013, 17:22 #10
Цитата Сообщение от Raali Посмотреть сообщение
Разве чтобы упало?
С частыми остановками далеко не уедешь!
0
alex_x_x
бжни
2447 / 1652 / 84
Регистрация: 14.05.2009
Сообщений: 7,162
16.09.2013, 17:29 #11
Цитата Сообщение от mrKi Посмотреть сообщение
Qwertiy, да я ничего не предлагаю, с моими знаниями .. Раз нет аналогов значит буду учиться как его использовать.
ничто не мешает написать свой вариант с распечаткой __FILE__, __FUNCTION__, __LINE__ и вызовом abort() например
0
Qwertiy
821 / 629 / 75
Регистрация: 20.08.2013
Сообщений: 2,523
16.09.2013, 18:05 #12
Цитата Сообщение от alex_x_x Посмотреть сообщение
ничто не мешает написать свой вариант
Своё можно написать почти всегда. Только зачем писать свою реализацию assert'а? Чтобы в релизе тоже работало? Или есть другие причины?
0
alex_x_x
бжни
2447 / 1652 / 84
Регистрация: 14.05.2009
Сообщений: 7,162
16.09.2013, 18:20 #13
Цитата Сообщение от Qwertiy Посмотреть сообщение
Своё можно написать почти всегда. Только зачем писать свою реализацию assert'а? Чтобы в релизе тоже работало? Или есть другие причины?
тысяча причин, подстраивание под свою условную компиляцию, под свои логи, под нужное поведение
да тот же свой ASSERT может например исключение бросать, нужный сигнал итд
0
ValeryS
Модератор
6653 / 5062 / 470
Регистрация: 14.02.2011
Сообщений: 16,926
16.09.2013, 18:27 #14
Цитата Сообщение от mrKi Посмотреть сообщение
assert()
Цитата Сообщение от Qwertiy Посмотреть сообщение
Это проверка условия при отладке. Нужна для того, чтобы всё упало, если условие не выполняется. Для этого и используется.
С ним надо быть осторожнее, поскольку при компиляции в релизе он может буть убран вместе с агрументом.
в MFC есть макрос ACCERT и VERUFY
в отладочной версии программ работают идентично а в релизе ACCERT выбрасывает все что в скобках а VERUFY нет
C++
1
ACCERT(fnc());
функция пропадет
C++
1
VERUFY(fnc())
останется
C++
1
fnc();
вот реализация в релизе
C++
1
#define VERIFY(f)          ((void)(f))
вот в дебиге
C++
1
#define VERIFY(f)          ASSERT(f)
C++
1
#define ASSERT(f)          DEBUG_ONLY((void) ((f) || !::AfxAssertFailedLine(THIS_FILE, __LINE__) || (AfxDebugBreak(), 0)))
как реализован
assert
и есть ли verify пока ничего сказать не могу

Добавлено через 4 минуты
вот реализация assert в релизе
C++
1
#define assert(_Expression)     ((void)0)
в дебиге
C++
1
#define assert(_Expression) (void)( (!!(_Expression)) || (_wassert(_CRT_WIDE(#_Expression), _CRT_WIDE(__FILE__), __LINE__), 0) )
это в студии
в Qt не нашел
1
alex_x_x
бжни
2447 / 1652 / 84
Регистрация: 14.05.2009
Сообщений: 7,162
16.09.2013, 20:21 #15
Цитата Сообщение от ValeryS Посмотреть сообщение
в Qt не нашел
Q_ASSERT/Q_ASSERT_X
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.09.2013, 20:21
Привет! Вот еще темы с ответами:

Исключительные ситуации - C++
Надо сделать так, чтоб при вводе чарового символа в итовый вектор выводило сообщение об ошибке, но программа не закрывалась, а просто...

Исключительные ситуации - C++
Как обработать исключительную ситуацию,когда переменная описана как int,к примеру,а вводится какой-нибудь char?А то нам как то в лекции...

Исключительные ситуации в классах - C++
Добрый день. Нужна помощь, есть класс дробей. В нём я сделал исключительные ситуации для переполенения и для деления на 0. Но надо чтобы...

обработать исключительные ситуации - C++
Функция вычисляет корень квадратного уравнения ax2+bx+c=0 Нужно обработать исключительные ситуации


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
15
Yandex
Объявления
16.09.2013, 20:21
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru