longjmp/setjmp

10 отговора 340 прегледа
#1

longjmp/setjmp

Zdraveite.Naskoro popadnah na tezi dve sladki funkzii i se 4uda da li te mogat tha namerqt realna upotreba v golemi proekti.Li4no na men mi se struva 4e ni6to im nqma i daje mnogo pomagat v zadulbo4eni situazii no vse pak da se dopitam .E tva e.Are 4ao!

Отговор
в отговор на Mihail121 #2

Re: longjmp/setjmp

Skrito-pokrito dosta C++ kompilatori izpolzwat longjmp, setjmp (ili podobni funckii) kogato trjabwa da obrabotjat exceptionite.

Dosta biblioteki sushto polzwat - naprimer The Intel JPEG library (pone za neja se seshtam).

Отговор
в отговор на Mihail121 #3

Re: longjmp/setjmp

setjmp и longjmp са включени в ранните години на C, и може би са имали някакво приложение тогава. Сега обаче в никакъв, ама никакъв случай не бива да се ползват. Проблемът с тях е, че правят програмата наистина непредвидима, могат да доведат до невероятни проблеми, а и на практика обезсмислят обектно-ориентираното програмиране - фактът, че не признават деструктори и т.н. и т.н.... Могат да се получат проблеми с неосвободени ресурси и т.н. Абе с една дума - не ги ползвай Това, което могат да ти дадат, могат да ти го дадат и много по-елегантни механизми от съвременното ООП

Отговор
в отговор на ironcode #4

P.S.

Ето какво казва MSDN по въпроса:

Do not use setjmp and longjmp in C++ programs; these functions do not support C++ object semantics. Also, using these functions in C++ programs may degrade performance by preventing optimization on local variables. Use the C++ exception handling try/catch constructs instead.

If you do use setjmp/longjmp in a C++ program, the interaction between these functions and C++ exception handling requires that you include SETJMP.H or SETJMPEX.H. Destructors for local objects will be called during the stack unwind if you compile with the /GX (Enable Exception Handling) option. Also, if you intend your code to be portable, do not rely on correct destruction of frame-based objects when executing a nonlocal goto using a call to longjmp.

Отговор
в отговор на ironcode #5

Re: P.S.

От друга страна: In een recursief dalende ontleder is het dus noodzakelijk om selectief een aantal aktiveringen van functies / procedures te kunnen beeindigen. In C is het mogelijk om het setjmp/longjmp mechanisme te gebruiken om aktiveringen te beeindigen.

Ок, сериозно, кога ще разберете че C и C++ са различни езици? Естествено, че не бива да се смесват setjmp/longjmp с exception-и по същата причина, поради която не бива да се смесват malloc и new в една и съща програма.

Цитатът ти е абсолютно неподходящ. Както виждаш, съветват те да ползваш вместо тях try/catch. Да, ама try/catch в C просто не са предвидени.

Отговор
в отговор на hoopla #6

Re: P.S.

Аз знам че C и C++ са различни езици. Просто човекът не уточни на какъв език смята да ги ползва (повечето компилатори поддържат Ц++ така или иначе), а малкия също намеси C++. Затова се изказах в духа на C++ - че не бива да се ползват тези функции.

P.S. Ако забележиж първото ми мнение - говоря за деструктори и ООП, т.е. определено имам предвид именно C++.

Редактирано от ironcode на

Отговор
в отговор на Mihail121 #7

Re: longjmp/setjmp

Da be pravi ste za try/catch.Vse pak tova e nai-dobriqt i sugen na4in za hva6tane na gre6ki to togava napravo nema kvo da si govorim.No longjmp/setjmp nqma kak da oburkat programata ako sa izpolzvani s akul.I vse pak su6testvuvat isvestni riskove.Iskah da obsudime i ne6to drugo.Kakvo mislite za signalnata sistema predlagana ot funziqta signal(header-a e signal.h vi6te i MSDN),koqto dori moje da predotvrati cra6 pri nedostig na pamet,kra6 pri nevadni operazii i taka natatuk?

Отговор
в отговор на Mihail121 #8

Re: longjmp/setjmp

Щом пишеш на C++, послушай ironcode и не докосвай setjmp/longjmp.

А да разчиташ, че signal ще те спаси от краширане... Не знам къде си го прочел, но е толкова вероятно, колкото signal да запуши озоновата дупка. Можеш да прихванеш сигнала, че си помазал (или поне си се опитал) чужда памет и вместо да ти се затвори програмата, да продължиш да мажеш, но това само ще увеличи проблемите, няма да ги намали.

Отговор
в отговор на hoopla #9

Re: longjmp/setjmp

Ама зависи и от операционната система. Според MSDN например под Windows NT със signal не можеш да хванеш Illegal instruction, Illegal storage access или Termination request, а само Abnormal termination, Floating-point error и CTRL+C signal. Михаил, ако искаш програмата да работи под Windows NT за съответните видове грешки, препоръчвам ти да разгледаш за какво става дума при SEH (Structured Exception Handling), който можеш да използваш при Microsoft C/C++ с ключовите думи __try, __except и __finally.

Отговор
в отговор на ironcode #10

Re: longjmp/setjmp

Blagodarq za suvetite mom4eta.Qvno si razbirate!

Отговор
в отговор на ironcode #11

Re: P.S.

Az prosto mu dadoh primer che C++ izpolzwa setjmp/longjmp wutreshno (njakoi realizatzii) za da si realizirat exception-handlinga. Ako chovek e umen shte se seti - che ako C++ gi izpolzwa to ne e preporuchitelno i programista da gi polzwa ako pishe na C++ (sus exceptioni). Wse pak ako ne se izpolzwat exceptioni wuw C++-a mozhe i longjmp/setjmp da se polzwat.

P.S. Ако забележиж първото ми мнение - говоря за деструктори и ООП, т.е. определено имам предвид именно C++.
Destruktori, i OOP mozhe da ima i pod C, no v momenta prosto se zajazhdam .

Отговор