2 / 2 / 2
Регистрация: 01.08.2013
Сообщений: 60
1

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

16.09.2013, 15:45. Показов 1302. Ответов 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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
16.09.2013, 15:45
Ответы с готовыми решениями:

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

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

Исключительные ситуации
Функция должна выполнять проверку параметров, передаваемых и генерировать исключения в случае...

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

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

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

В общем все понятно. Спасибо.
0
858 / 447 / 112
Регистрация: 06.07.2013
Сообщений: 1,494
16.09.2013, 17:13 9
Цитата Сообщение от Qwertiy Посмотреть сообщение
Нужна для того, чтобы всё упало, если условие не выполняется.
Разве чтобы упало? просто остановится тогда как на брейкпойнте
0
Don't worry, be happy
17758 / 10526 / 2030
Регистрация: 27.09.2012
Сообщений: 26,502
Записей в блоге: 1
16.09.2013, 17:22 10
Цитата Сообщение от Raali Посмотреть сообщение
Разве чтобы упало?
С частыми остановками далеко не уедешь!
0
бжни
2473 / 1684 / 135
Регистрация: 14.05.2009
Сообщений: 7,162
16.09.2013, 17:29 11
Цитата Сообщение от mrKi Посмотреть сообщение
Qwertiy, да я ничего не предлагаю, с моими знаниями .. Раз нет аналогов значит буду учиться как его использовать.
ничто не мешает написать свой вариант с распечаткой __FILE__, __FUNCTION__, __LINE__ и вызовом abort() например
0
830 / 638 / 100
Регистрация: 20.08.2013
Сообщений: 2,524
16.09.2013, 18:05 12
Цитата Сообщение от alex_x_x Посмотреть сообщение
ничто не мешает написать свой вариант
Своё можно написать почти всегда. Только зачем писать свою реализацию assert'а? Чтобы в релизе тоже работало? Или есть другие причины?
0
бжни
2473 / 1684 / 135
Регистрация: 14.05.2009
Сообщений: 7,162
16.09.2013, 18:20 13
Цитата Сообщение от Qwertiy Посмотреть сообщение
Своё можно написать почти всегда. Только зачем писать свою реализацию assert'а? Чтобы в релизе тоже работало? Или есть другие причины?
тысяча причин, подстраивание под свою условную компиляцию, под свои логи, под нужное поведение
да тот же свой ASSERT может например исключение бросать, нужный сигнал итд
0
Модератор
Эксперт по электронике
8698 / 6496 / 879
Регистрация: 14.02.2011
Сообщений: 22,726
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
бжни
2473 / 1684 / 135
Регистрация: 14.05.2009
Сообщений: 7,162
16.09.2013, 20:21 15
Цитата Сообщение от ValeryS Посмотреть сообщение
в Qt не нашел
Q_ASSERT/Q_ASSERT_X
0
Модератор
Эксперт по электронике
8698 / 6496 / 879
Регистрация: 14.02.2011
Сообщений: 22,726
16.09.2013, 20:30 16
Цитата Сообщение от alex_x_x Посмотреть сообщение
Q_ASSERT/Q_ASSERT_X
это я знаю
я искал именно assert
во многих исходниках именно он упоминается

Добавлено через 5 минут
ну вот реализация из Qt если интересно
C++
1
2
3
4
5
6
7
8
9
10
11
inline void qt_noop(void) {}
 
Q_CORE_EXPORT void qt_assert(const char *assertion, const char *file, int line) Q_DECL_NOTHROW;
 
#if !defined(Q_ASSERT)
#  if defined(QT_NO_DEBUG) && !defined(QT_FORCE_ASSERTS)
#    define Q_ASSERT(cond) qt_noop()
#  else
#    define Q_ASSERT(cond) ((!(cond)) ? qt_assert(#cond,__FILE__,__LINE__) : qt_noop())
#  endif
#endif
кода qt_assert не нашел

Добавлено через 1 минуту
C++
1
2
3
4
5
6
7
8
9
Q_CORE_EXPORT void qt_assert_x(const char *where, const char *what, const char *file, int line) Q_DECL_NOTHROW;
 
#if !defined(Q_ASSERT_X)
#  if defined(QT_NO_DEBUG) && !defined(QT_FORCE_ASSERTS)
#    define Q_ASSERT_X(cond, where, what) qt_noop()
#  else
#    define Q_ASSERT_X(cond, where, what) ((!(cond)) ? qt_assert_x(where, what,__FILE__,__LINE__) : qt_noop())
#  endif
#endif
0
Higher
1952 / 1218 / 120
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
16.09.2013, 20:55 17
Цитата Сообщение от mrKi Посмотреть сообщение
зачем (в книжке приводиться такой приме) делать более сложные конструкции
Чтобы избежать дублирования кода.
Например, если вам нужно перегрузить n операторов для своего класса, причем тела этих операторов не сильно отличаются, то дефайны сэкономят кучу строк кода. Например, в гццшной реализации valarray для этой цели используется пачка дефайнов в ~100 строк длиной каждый. Вроде бы страшно, но это таки явно лучше брутального копипаста.
0
бжни
2473 / 1684 / 135
Регистрация: 14.05.2009
Сообщений: 7,162
16.09.2013, 20:57 18
Ничего необычного там нет

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
/*
  The Q_ASSERT macro calls this function when the test fails.
*/
void qt_assert(const char *assertion, const char *file, int line)
{
    qFatal("ASSERT: \"%s\" in file %s, line %d", assertion, file, line);
}
 
void qFatal(const char *msg, ...)
{
    va_list ap;
    va_start(ap, msg); // use variable arg list
    qt_message(QtFatalMsg, msg, ap);
    va_end(ap);
}
оно не прерывает исполнение
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
16.09.2013, 20:57
Помогаю со студенческими работами здесь

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru