Если вы хотите быть переносимым, то можете использовать индексы массива для массива, в котором хранятся все 64-битные указатели (или просто массив указателей на структуры со страницами информации о том, что делать с каким-то исключением).
Как вы заполняете такой массив - это другой вопрос. Конечно, вам не нужно заполнять массив всеми экземплярами, которые могут стать исключением, только теми, которые у вас try -ed и способны catch . Но, вероятно, вам понадобится больше, чем просто указатель (так как вам приходится иметь дело со случаем времени выполнения, когда у вас есть одно и то же исключение, пойманное в нескольких активных местах в вашем стеке.)
Как только вы решите вышеуказанную проблему, возможно, вы даже сможете использовать short int
для этой вещи, как только вы поймете природу проблемы, которую вам нужно решить.
Основываясь на прочтении комментариев, я вижу, что вы заметили, что глобальная переменная не подходит из-за проблем с многопоточностью. Во-первых, вы можете иметь его global в контексте потока (как, например, переменная errno
), поскольку это является причиной использования void *
для вызова подпрограммы, выполняемой потоком, и возврата назад, когда закончил. Вы можете иметь это там, частный, чтобы нанизывать глобальные данные.
Во-вторых, если вы хотите управлять такими странными вещами с точки зрения C, как странные способы манипулирования стеком, упомянутые функции выполняют (я не думаю, что вы полностью знаете, как работают внутренние компоненты *). 1020 * / longjmp()
работа.) Я могу вам сказать, что setjmp()
/ longjmp()
API был написан давным-давно (в диапазоне 50 лет сейчас), во времена старого кода Unix V6, чтобы справиться с неизвестной обработкой ошибок драйверов устройств Unix - очень контролируемой и простой средой -) просто, использование longjmp()
гораздо сложнее (и настоятельно не рекомендуется даже их авторами K & R), чем переключение на другой язык (например, C ++), который полностью поддерживает исключения в своей основе (эта рекомендация не моя, она была предложена в комментариях к вашему вопросу)
В-третьих. Если вы используете setjmp()
и longjmp()
, вам также необходимо знать, что они (оба) используют стек вызывающего потока для маркировки указателя и , куда идти для хранения информации. Таким образом, вы должны контролировать, например, что если вы сделаете longjmp()
в обработчике сигнала, вы можете серьезно уничтожить стек потока, выполняющего обработчик сигнала (который был прерван сигналом), если он это не та же тема, что и тот, кто сделал вызов setjmp()
. Причина этого заключается в том, что прерванный поток переключит свой стек вместе с потоком, который выполнил setjmp()
, и оба потока начнут выполнять код с одним и тем же стеком в разных точках, что возвращает к времени реализации обоих функции (там был только компьютер pdp, без нескольких процессоров / ядер, как это принято сегодня, поэтому было только стек ). Здесь вы должны быть особенно осторожны, потому что обычно поток, который генерирует Исключением является то же, что места для ловят , но это может быть ложным для асинхронных ловушек, таких как обработка сигналов.
Кстати, то, что вы делаете, очень интересно, и позволит вам узнать, как язык реализует внутренне сложные поведения, такие как обработка исключений. Я аплодирую вам за вашу смелость пробовать подобные вещи, и не стесняйтесь, что если вам нужен наставник в C ++, я буду доступен для вас.
Только не сдавайся !!