longjmp/setjmp
10 отговора
340 прегледа
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!
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).
Dosta biblioteki sushto polzwat - naprimer The Intel JPEG library (pone za neja se seshtam).
Re: longjmp/setjmp
setjmp и longjmp са включени в ранните години на C, и може би са имали някакво приложение тогава. Сега обаче в никакъв, ама никакъв случай не бива да се ползват. Проблемът с тях е, че правят програмата наистина непредвидима, могат да доведат до невероятни проблеми, а и на практика обезсмислят обектно-ориентираното програмиране - фактът, че не признават деструктори и т.н. и т.н.... Могат да се получат проблеми с неосвободени ресурси и т.н. Абе с една дума - не ги ползвай
Това, което могат да ти дадат, могат да ти го дадат и много по-елегантни механизми от съвременното ООП 
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.
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.
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 просто не са предвидени.
Ок, сериозно, кога ще разберете че C и C++ са различни езици? Естествено, че не бива да се смесват setjmp/longjmp с exception-и по същата причина, поради която не бива да се смесват malloc и new в една и съща програма.
Цитатът ти е абсолютно неподходящ. Както виждаш, съветват те да ползваш вместо тях try/catch. Да, ама try/catch в C просто не са предвидени.
Re: P.S.
Аз знам че C и C++ са различни езици. Просто човекът не уточни на какъв език смята да ги ползва (повечето компилатори поддържат Ц++ така или иначе), а малкия също намеси C++. Затова се изказах в духа на C++ - че не бива да се ползват тези функции.
P.S. Ако забележиж първото ми мнение - говоря за деструктори и ООП, т.е. определено имам предвид именно C++.
P.S. Ако забележиж първото ми мнение - говоря за деструктори и ООП, т.е. определено имам предвид именно C++.
Редактирано от ironcode на
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?
Re: longjmp/setjmp
Щом пишеш на C++, послушай ironcode и не докосвай setjmp/longjmp.
А да разчиташ, че signal ще те спаси от краширане... Не знам къде си го прочел, но е толкова вероятно, колкото signal да запуши озоновата дупка. Можеш да прихванеш сигнала, че си помазал (или поне си се опитал) чужда памет и вместо да ти се затвори програмата, да продължиш да мажеш, но това само ще увеличи проблемите, няма да ги намали.
А да разчиташ, че signal ще те спаси от краширане... Не знам къде си го прочел, но е толкова вероятно, колкото signal да запуши озоновата дупка. Можеш да прихванеш сигнала, че си помазал (или поне си се опитал) чужда памет и вместо да ти се затвори програмата, да продължиш да мажеш, но това само ще увеличи проблемите, няма да ги намали.
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.
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
.
P.S. Ако забележиж първото ми мнение - говоря за деструктори и ООП, т.е. определено имам предвид именно C++.
Destruktori, i OOP mozhe da ima i pod C, no v momenta prosto se zajazhdam