![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| sergey_kovtunenko |
|
||||||||
|
Новичок Профиль Группа: Участник Сообщений: 3 Регистрация: 26.8.2007 Репутация: нет Всего: нет |
Привет! Пришла идея написать эмуляцию обработки исключительных ситуаций для ANSI C. Это должна быть высокопортируемая библиотека макроопределений, использующая достоинства (и недостатки нелокальных переходов в С -- setjmp()\longjmp()). Насколько мне известно, готовых решений на pure ANSI C на данный момент нет. По крайней мере гугление ни к чему не привело.
При написании библиотеки столкнулся с рядом проблем, которые мне трудно решить. Поэтому публикую исходный код тестовой версии библиотеки. Я использую ANSI C'99 совместимый компилятор пока (в конце вычищу код для C'89), поэтому по ходу могут встречаться комментарии в стиле С++. В тестовой версии библиотеки все глобальные переменные прямо лежат внутри заголовочного файла. Это сделано для упрощения отладки. Т.е. грубо говоря, эта версия всего лишь модель. После получения работоспособной модели все глобальные переменные будут локализованы в исходном файле библиотеки, будут статическими и доступ к ним будет осуществляться только через функции. Цель создания библиотеки: * Получить преимущества обработки исключений в языке С. О различиях между SEH и обычным подходом проверки возвращаемых значений функцией можно почитать у Б. Страуструпа в 14 главе русского "Язык программирования С++" * Получить высокопортируемую библиотеку, которую можно будет использовать на любой платформе, где есть стандартная библиотека С. Классно иметь средство, которое будет компилироваться на любом ANSI C совместимом компиляторе! Из недостатков можно выделить: * _Синтаксическую_ (но не идеологическую) несовместимость с С++ ;( * Незащищённость от многопоточночти из-за применения статических переменных. В планах, после завершения варианта для однопоточных переменных приступить к реализации версии, корректно работающей с многопоточными приложениями Общая Концепция библиотеки состоит в следующем:
Для тех, кто дочитал до этого момента и не закрыл окно браузера, пояснение алгоритма и подводные камни. Пояснение и различия с С++ подходом:
В либе реализован массив значений {буффер_сохранения_состояния, код возвращаемого значения} размером в максимальную глубину вложенности. При заходе в новый блок TRY индекс массива увеличивается и запоминается новое состояние. При выходе из блока TRY индекс массива декрементируется. Неинформативные глобальные имена индексов i, j выбраны чисто для наглядности и удобства набора. ;) Переменная j была нужна для защиты от локальных переходов и возбуждения сигналов goto\return()\raise(). Она работала так:
Прошу помощи в реализации манипуляций с индексами массива и, возможно, логикой работы. Цель: сделать библиотеку "пуленепробиваемой" с некоторыми ограничениями. Это сообщение отредактировал(а) sergey_kovtunenko - 26.8.2007, 14:27 |
||||||||
|
|||||||||
| MAKCim |
|
||||||||||||||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: 52 Всего: 207 |
если у тебя
а
то конструкция
будет иметь вид
т. е неправильный вид может так
решение такое
где count номер текущего CATCH (увеличивается на 1 с каждым CATCH пока не достигнут limit (тогда вызывается terminate())) -------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
||||||||||||||
|
|||||||||||||||
| sergey_kovtunenko |
|
||||
|
Новичок Профиль Группа: Участник Сообщений: 3 Регистрация: 26.8.2007 Репутация: нет Всего: нет |
Посмотри, я в первом блоке кода писал про синтаксис обработчиков... В конце должен быть TRYEND; который и делает обрамляющий }while(0); |
||||
|
|||||
| MAKCim |
|
|||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: 52 Всего: 207 |
sergey_kovtunenko,
нет, я про то, что конструкция
неправильна -------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
|||
|
||||
| sergey_kovtunenko |
|
||||||
|
Новичок Профиль Группа: Участник Сообщений: 3 Регистрация: 26.8.2007 Репутация: нет Всего: нет |
Посмотри внимательней на код макросов TRY, TRYEND, CATCH, CATCHALL. Даже форматирование кода позволяет увидеть, что количество открывающихся и закрывающихся скобок сопоставлено.
Да и не может быть по другому, ведь при ошибке со '}' код бы просто не скомпилировался. |
||||||
|
|||||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |