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

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

Восстановить пароль Регистрация
 
mrKi
2 / 2 / 0
Регистрация: 01.08.2013
Сообщений: 60
16.09.2013, 15:45     Препроцессор,исключительные ситуации #1
Всем доброго времени суток!) По прочтению изложенного в моей книге материала по искл. ситуациям и операторам препроцессора(? так можно назвать вот это: "#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()
Он используется?
Вот это мне не понятно.
Заранее спасибо за внятные,аргументированные ответы!
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.09.2013, 15:45     Препроцессор,исключительные ситуации
Посмотрите здесь:

Исключительные ситуации C++
исключительные ситуации C++
Исключительные ситуации C++
C++ исключительные ситуации
Исключительные ситуации C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
alex_x_x
бжни
 Аватар для alex_x_x
2441 / 1646 / 84
Регистрация: 14.05.2009
Сообщений: 7,163
16.09.2013, 15:49     Препроцессор,исключительные ситуации #2
Цитата Сообщение от mrKi Посмотреть сообщение
пишется код , и в случае чего,в нем же нужно сделать
в ральной жизни этот throw может лежать в 10 вызовах вложенности под вашей функцией, в другом модуле, в другой библиотеке итд

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

В общем все понятно. Спасибо.
Raali
572 / 276 / 12
Регистрация: 06.07.2013
Сообщений: 917
Завершенные тесты: 1
16.09.2013, 17:13     Препроцессор,исключительные ситуации #9
Цитата Сообщение от Qwertiy Посмотреть сообщение
Нужна для того, чтобы всё упало, если условие не выполняется.
Разве чтобы упало? просто остановится тогда как на брейкпойнте
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11800 / 6779 / 765
Регистрация: 27.09.2012
Сообщений: 16,829
Записей в блоге: 2
Завершенные тесты: 1
16.09.2013, 17:22     Препроцессор,исключительные ситуации #10
Цитата Сообщение от Raali Посмотреть сообщение
Разве чтобы упало?
С частыми остановками далеко не уедешь!
alex_x_x
бжни
 Аватар для alex_x_x
2441 / 1646 / 84
Регистрация: 14.05.2009
Сообщений: 7,163
16.09.2013, 17:29     Препроцессор,исключительные ситуации #11
Цитата Сообщение от mrKi Посмотреть сообщение
Qwertiy, да я ничего не предлагаю, с моими знаниями .. Раз нет аналогов значит буду учиться как его использовать.
ничто не мешает написать свой вариант с распечаткой __FILE__, __FUNCTION__, __LINE__ и вызовом abort() например
Qwertiy
817 / 625 / 75
Регистрация: 20.08.2013
Сообщений: 2,525
16.09.2013, 18:05     Препроцессор,исключительные ситуации #12
Цитата Сообщение от alex_x_x Посмотреть сообщение
ничто не мешает написать свой вариант
Своё можно написать почти всегда. Только зачем писать свою реализацию assert'а? Чтобы в релизе тоже работало? Или есть другие причины?
alex_x_x
бжни
 Аватар для alex_x_x
2441 / 1646 / 84
Регистрация: 14.05.2009
Сообщений: 7,163
16.09.2013, 18:20     Препроцессор,исключительные ситуации #13
Цитата Сообщение от Qwertiy Посмотреть сообщение
Своё можно написать почти всегда. Только зачем писать свою реализацию assert'а? Чтобы в релизе тоже работало? Или есть другие причины?
тысяча причин, подстраивание под свою условную компиляцию, под свои логи, под нужное поведение
да тот же свой ASSERT может например исключение бросать, нужный сигнал итд
ValeryS
Модератор
6373 / 4839 / 440
Регистрация: 14.02.2011
Сообщений: 16,038
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 не нашел
alex_x_x
бжни
 Аватар для alex_x_x
2441 / 1646 / 84
Регистрация: 14.05.2009
Сообщений: 7,163
16.09.2013, 20:21     Препроцессор,исключительные ситуации #15
Цитата Сообщение от ValeryS Посмотреть сообщение
в Qt не нашел
Q_ASSERT/Q_ASSERT_X
ValeryS
Модератор
6373 / 4839 / 440
Регистрация: 14.02.2011
Сообщений: 16,038
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
diagon
Higher
 Аватар для diagon
1920 / 1186 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
16.09.2013, 20:55     Препроцессор,исключительные ситуации #17
Цитата Сообщение от mrKi Посмотреть сообщение
зачем (в книжке приводиться такой приме) делать более сложные конструкции
Чтобы избежать дублирования кода.
Например, если вам нужно перегрузить n операторов для своего класса, причем тела этих операторов не сильно отличаются, то дефайны сэкономят кучу строк кода. Например, в гццшной реализации valarray для этой цели используется пачка дефайнов в ~100 строк длиной каждый. Вроде бы страшно, но это таки явно лучше брутального копипаста.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.09.2013, 20:57     Препроцессор,исключительные ситуации
Еще ссылки по теме:

C++ Исключительные ситуации
C++ Исключительные ситуации
C++ Исключительные ситуации!

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

Или воспользуйтесь поиском по форуму:
alex_x_x
бжни
 Аватар для alex_x_x
2441 / 1646 / 84
Регистрация: 14.05.2009
Сообщений: 7,163
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);
}
оно не прерывает исполнение
Yandex
Объявления
16.09.2013, 20:57     Препроцессор,исключительные ситуации
Ответ Создать тему
Опции темы

Текущее время: 08:27. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru