Niektóre środowiska obsługują to mniej więcej bezpośrednio.
Na przykład, jeśli włączysz structured exception handling i wyjątków C++ przez przełącznik /EH
kompilatora, można mieć wyjątki C++ realizowane w ciągu uporządkowanego wyjątkiem Microsoft magazynowe („wyjątki” do C). Pod warunkiem, że te opcje są ustawione podczas kompilowania całego kodu (C++ na każdym końcu i C w środku) rozwijanie stosu będzie "działało".
Jednak prawie zawsze jest to zły pomysł (TM). Dlaczego, pytasz? Uważają, że kawałek kodu C w środku jest:
WaitForSingleObject(mutex, ...);
invoke_cxx_callback(...);
ReleaseMutex(mutex);
I że invoke_cxx_callback()
(.... werble ...) wywołuje Twój kod C++, który zgłasza wyjątek. Wycieksz blokadę mutex. Oooo.
Widzisz, chodzi o to, że większość kodu C nie jest napisana do obsługi rozwijania stosów w stylu C++ w dowolnym momencie podczas wykonywania funkcji. Co więcej, nie ma destruktorów, więc nie ma potrzeby ochrony przed wyjątkami.
Kenny TM ma rozwiązanie dla projektów opartych na C++ 11 i Boost. xxbbcc ma bardziej ogólne, aczkolwiek bardziej nużące rozwiązanie dla ogólnego przypadku.
Jeśli wyjątek jest zgłaszany przez wartość, czy 'wyjątek_ptr' zachowa go przy życiu? –
@SethCarnegie: Standardowo, tak. (§18.8.5/8 "Obiekt przywoływany zachowuje ważność co najmniej tak długo, jak istnieje obiekt' exception_ptr', który się do niego odnosi. ") Implementacja Boost powinna być taka sama. – kennytm
To jest niesamowite, wygląda na to, że Komitet zaprojektował dla mnie C++ 11. To również dlatego, że VS2010 implementuje 'wyjątek_ptr',' current_exception' i 'rethrow_exception', które mogę zaakceptować. Dzięki. –